60 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			Bash
		
	
	
	
	
	
|   | #!/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 "\n"; | ||
|  | 	} | ||
|  | }' | | ||
|  | 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 |