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 | |
Max Filippov | 36b5401 | 2013-08-23 00:25:24 +0400 | [diff] [blame^] | 12 | printf "File list \tundefined symbol used\n" |
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). |
Roland Dreier | 03b550d | 2010-06-02 13:56:36 -0700 | [diff] [blame] | 17 | sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i |
Paolo 'Blaisorblade' Giarrusso | 0bce673 | 2007-08-25 09:45:28 +0200 | [diff] [blame] | 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 |
Max Filippov | 36b5401 | 2013-08-23 00:25:24 +0400 | [diff] [blame^] | 57 | printf "$files: \t$symb\n" |
Paolo 'Blaisorblade' Giarrusso | 0bce673 | 2007-08-25 09:45:28 +0200 | [diff] [blame] | 58 | fi |
| 59 | done|sort |