Blame view

scripts/checkkconfigsymbols.sh 1.81 KB
0bce67352   Paolo 'Blaisorblade' Giarrusso   kbuild: script to...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
57
58
59
60
  #!/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*[^~]'`"
  
  echo -e "File list \tundefined symbol used"
  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).
  	sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Z_]\+\).*!\2 '$i'!p' < $i
  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
  		echo -e "$files: \t$symb"
  	fi
  done|sort