Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[linux-2.6.git] / scripts / checkkconfigsymbols.sh
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
12 /bin/echo -e "File list \tundefined symbol used"
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-Za-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
57                 /bin/echo -e "$files: \t$symb"
58         fi
59 done|sort