| #!/bin/sh |
| # Find Kconfig variables used in source code but never defined in Kconfig |
| # Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> |
| |
| # Tested with dash. |
| paths="$@" |
| [ -z "$paths" ] && paths=. |
| |
| # Doing this once at the beginning saves a lot of time, on a cache-hot tree. |
| Kconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`" |
| |
| echo -e "File list \tundefined symbol used" |
| find $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i |
| do |
| # Output the bare Kconfig variable and the filename; the _MODULE part at |
| # the end is not removed here (would need perl an not-hungry regexp for that). |
| sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Z_]\+\).*!\2 '$i'!p' < $i |
| done | \ |
| # Smart "sort|uniq" implemented in awk and tuned to collect the names of all |
| # files which use a given symbol |
| awk '{map[$1, count[$1]++] = $2; } |
| END { |
| for (combIdx in map) { |
| split(combIdx, separate, SUBSEP); |
| # The value may have been removed. |
| if (! ( (separate[1], separate[2]) in map ) ) |
| continue; |
| symb=separate[1]; |
| printf "%s ", symb; |
| #Use gawk extension to delete the names vector |
| delete names; |
| #Portably delete the names vector |
| #split("", names); |
| for (i=0; i < count[symb]; i++) { |
| names[map[symb, i]] = 1; |
| # Unfortunately, we may still encounter symb, i in the |
| # outside iteration. |
| delete map[symb, i]; |
| } |
| i=0; |
| for (name in names) { |
| if (i > 0) |
| printf ", %s", name; |
| else |
| printf "%s", name; |
| i++; |
| } |
| printf "\n"; |
| } |
| }' | |
| while read symb files; do |
| # Remove the _MODULE suffix when checking the variable name. This should |
| # be done only on tristate symbols, actually, but Kconfig parsing is |
| # beyond the purpose of this script. |
| symb_bare=`echo $symb | sed -e 's/_MODULE//'` |
| if ! grep -q "\<$symb_bare\>" $Kconfigs; then |
| echo -e "$files: \t$symb" |
| fi |
| done|sort |