| Paolo 'Blaisorblade' Giarrusso | 0bce673 | 2007-08-25 09:45:28 +0200 | [diff] [blame] | 1 | #!/bin/sh | 
|  | 2 | # Find Kconfig variables used in source code but never defined in Kconfig | 
|  | 3 | # Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> | 
|  | 4 |  | 
|  | 5 | # Tested with dash. | 
|  | 6 | paths="$@" | 
|  | 7 | [ -z "$paths" ] && paths=. | 
|  | 8 |  | 
|  | 9 | # Doing this once at the beginning saves a lot of time, on a cache-hot tree. | 
|  | 10 | Kconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`" | 
|  | 11 |  | 
| Amerigo Wang | a3ee947 | 2009-08-19 18:19:55 +0800 | [diff] [blame] | 12 | /bin/echo -e "File list \tundefined symbol used" | 
| Paolo 'Blaisorblade' Giarrusso | 0bce673 | 2007-08-25 09:45:28 +0200 | [diff] [blame] | 13 | find $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i | 
|  | 14 | do | 
|  | 15 | # Output the bare Kconfig variable and the filename; the _MODULE part at | 
|  | 16 | # the end is not removed here (would need perl an not-hungry regexp for that). | 
|  | 17 | sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Z_]\+\).*!\2 '$i'!p' < $i | 
|  | 18 | done | \ | 
|  | 19 | # Smart "sort|uniq" implemented in awk and tuned to collect the names of all | 
|  | 20 | # files which use a given symbol | 
|  | 21 | awk '{map[$1, count[$1]++] = $2; } | 
|  | 22 | END { | 
|  | 23 | for (combIdx in map) { | 
|  | 24 | split(combIdx, separate, SUBSEP); | 
|  | 25 | # The value may have been removed. | 
|  | 26 | if (! ( (separate[1], separate[2]) in map ) ) | 
|  | 27 | continue; | 
|  | 28 | symb=separate[1]; | 
|  | 29 | printf "%s ", symb; | 
|  | 30 | #Use gawk extension to delete the names vector | 
|  | 31 | delete names; | 
|  | 32 | #Portably delete the names vector | 
|  | 33 | #split("", names); | 
|  | 34 | for (i=0; i < count[symb]; i++) { | 
|  | 35 | names[map[symb, i]] = 1; | 
|  | 36 | # Unfortunately, we may still encounter symb, i in the | 
|  | 37 | # outside iteration. | 
|  | 38 | delete map[symb, i]; | 
|  | 39 | } | 
|  | 40 | i=0; | 
|  | 41 | for (name in names) { | 
|  | 42 | if (i > 0) | 
|  | 43 | printf ", %s", name; | 
|  | 44 | else | 
|  | 45 | printf "%s", name; | 
|  | 46 | i++; | 
|  | 47 | } | 
|  | 48 | printf "\n"; | 
|  | 49 | } | 
|  | 50 | }' | | 
|  | 51 | while read symb files; do | 
|  | 52 | # Remove the _MODULE suffix when checking the variable name. This should | 
|  | 53 | # be done only on tristate symbols, actually, but Kconfig parsing is | 
|  | 54 | # beyond the purpose of this script. | 
|  | 55 | symb_bare=`echo $symb | sed -e 's/_MODULE//'` | 
|  | 56 | if ! grep -q "\<$symb_bare\>" $Kconfigs; then | 
| Amerigo Wang | a3ee947 | 2009-08-19 18:19:55 +0800 | [diff] [blame] | 57 | /bin/echo -e "$files: \t$symb" | 
| Paolo 'Blaisorblade' Giarrusso | 0bce673 | 2007-08-25 09:45:28 +0200 | [diff] [blame] | 58 | fi | 
|  | 59 | done|sort |