10bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso#!/bin/sh
20bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Find Kconfig variables used in source code but never defined in Kconfig
30bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
40bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso
50bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Tested with dash.
60bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussopaths="$@"
70bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso[ -z "$paths" ] && paths=.
80bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso
90bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Doing this once at the beginning saves a lot of time, on a cache-hot tree.
100bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' GiarrussoKconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`"
110bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso
12a3ee9470e6ccce28b5c2a1c098a5ee5aa053c668Amerigo Wang/bin/echo -e "File list \tundefined symbol used"
130bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussofind $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i
140bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodo
150bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	# Output the bare Kconfig variable and the filename; the _MODULE part at
160bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	# the end is not removed here (would need perl an not-hungry regexp for that).
1703b550d3f9faf912d935ea310363e8e96d3aeeeaRoland Dreier	sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i
180bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodone | \
190bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Smart "sort|uniq" implemented in awk and tuned to collect the names of all
200bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# files which use a given symbol
210bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussoawk '{map[$1, count[$1]++] = $2; }
220bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' GiarrussoEND {
230bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	for (combIdx in map) {
240bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		split(combIdx, separate, SUBSEP);
250bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		# The value may have been removed.
260bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		if (! ( (separate[1], separate[2]) in map ) )
270bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			continue;
280bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		symb=separate[1];
290bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		printf "%s ", symb;
300bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		#Use gawk extension to delete the names vector
310bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		delete names;
320bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		#Portably delete the names vector
330bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		#split("", names);
340bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		for (i=0; i < count[symb]; i++) {
350bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			names[map[symb, i]] = 1;
360bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			# Unfortunately, we may still encounter symb, i in the
370bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			# outside iteration.
380bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			delete map[symb, i];
390bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		}
400bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		i=0;
410bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		for (name in names) {
420bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			if (i > 0)
430bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso				printf ", %s", name;
440bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			else
450bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso				printf "%s", name;
460bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso			i++;
470bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		}
480bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso		printf "\n";
490bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	}
500bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso}' |
510bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussowhile read symb files; do
520bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	# Remove the _MODULE suffix when checking the variable name. This should
530bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	# be done only on tristate symbols, actually, but Kconfig parsing is
540bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	# beyond the purpose of this script.
550bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	symb_bare=`echo $symb | sed -e 's/_MODULE//'`
560bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	if ! grep -q "\<$symb_bare\>" $Kconfigs; then
57a3ee9470e6ccce28b5c2a1c098a5ee5aa053c668Amerigo Wang		/bin/echo -e "$files: \t$symb"
580bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso	fi
590bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodone|sort
60