Root/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.
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
12printf "File list \tundefined symbol used\n"
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-Za-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        printf "$files: \t$symb\n"
58    fi
59done|sort
60

Archive Download this file



interactive