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. 6paths="$@" 7[ -z "$paths" ] && paths=. 8 9# Doing this once at the beginning saves a lot of time, on a cache-hot tree. 10Kconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`" 11 12echo -e "File list \tundefined symbol used" 13find $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i 14do 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 18done | \ 19# Smart "sort|uniq" implemented in awk and tuned to collect the names of all 20# files which use a given symbol 21awk '{map[$1, count[$1]++] = $2; } 22END { 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}' | 51while 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 echo -e "$files: \t$symb" 58 fi 59done|sort 60