summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>2007-08-25 11:45:28 +0400
committerSam Ravnborg <sam@neptun.(none)>2007-10-12 23:13:50 +0400
commit0bce67352b580e9025059ecc71e13e0ffd281254 (patch)
tree1528e7fbeed10b04b3013a9dffb26acf28c1aee4 /scripts
parentaa1e5ef5c1d95e7ebf0821d9ba27debe43a87a22 (diff)
downloadlinux-0bce67352b580e9025059ecc71e13e0ffd281254.tar.xz
kbuild: script to check for undefined Kconfig symbols
To avoid having to look manually for used but undefined Kconfig variables, I've written a script which tries do this efficiently, in case all other attention fail. It accounts for _MODULE suffix and for UML_ prefixes to Kconfig variable, but otherwise looks for exact matches (i.e. \<CONFIG_; this is done to exclude macros like MMCONFIG_). Undefined Kconfig variables should be not be removed without care, but for instance arch/i386/boot/ uses a bunch of undefined Kconfig vars: $ scripts/checkunknowndefines.sh arch/i386/boot/ arch/i386/boot/video.h uses undefined symbol VIDEO_400_HACK arch/i386/boot/video-vga.c uses undefined symbol VIDEO_400_HACK arch/i386/boot/video.c uses undefined symbol VIDEO_RETAIN arch/i386/boot/video.h uses undefined symbol VIDEO_RETAIN arch/i386/boot/video.h uses undefined symbol VIDEO_SVGA arch/i386/boot/video.h uses undefined symbol VIDEO_VESA arch/i386/boot/video-vesa.c uses undefined symbol VIDEO_VESA It should also be mentioned in SubmittingPatches and SubmitChecklist. Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Cc: Roman Zippel <zippel@linux-m68k.org> Cc: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/checkkconfigsymbols.sh59
1 files changed, 59 insertions, 0 deletions
diff --git a/scripts/checkkconfigsymbols.sh b/scripts/checkkconfigsymbols.sh
new file mode 100755
index 000000000000..39677c82747a
--- /dev/null
+++ b/scripts/checkkconfigsymbols.sh
@@ -0,0 +1,59 @@
+#!/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