linux/scripts/checkkconfigsymbols.sh
<<
>>
Prefs
   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
  12/bin/echo -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                /bin/echo -e "$files: \t$symb"
  58        fi
  59done|sort
  60