]>
Commit | Line | Data |
---|---|---|
0bce6735 PBG |
1 | #!/bin/sh |
2 | # Find Kconfig variables used in source code but never defined in Kconfig | |
3 | # Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <[email protected]> | |
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 | ||
36b5401b | 12 | printf "File list \tundefined symbol used\n" |
0bce6735 PBG |
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). | |
03b550d3 | 17 | sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i |
0bce6735 PBG |
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 | |
36b5401b | 57 | printf "$files: \t$symb\n" |
0bce6735 PBG |
58 | fi |
59 | done|sort |