Blame view

scripts/checkkconfigsymbols.sh 1.82 KB
0bce67352   Paolo 'Blaisorblade' Giarrusso   kbuild: script to...
1
2
3
4
5
6
7
8
9
10
  #!/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*[^~]'`"
a3ee9470e   Amerigo Wang   kbuild,scripts: u...
11
  /bin/echo -e "File list \tundefined symbol used"
0bce67352   Paolo 'Blaisorblade' Giarrusso   kbuild: script to...
12
13
14
15
  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).
03b550d3f   Roland Dreier   checkkconfigsymbo...
16
  	sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i
0bce67352   Paolo 'Blaisorblade' Giarrusso   kbuild: script to...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  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 "
  ";
  	}
  }' |
  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
a3ee9470e   Amerigo Wang   kbuild,scripts: u...
57
  		/bin/echo -e "$files: \t$symb"
0bce67352   Paolo 'Blaisorblade' Giarrusso   kbuild: script to...
58
59
  	fi
  done|sort