| 
									
										
										
										
											2007-08-25 09:45:28 +02:00
										 |  |  | #!/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*[^~]'`" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-23 00:25:24 +04:00
										 |  |  | printf "File list \tundefined symbol used\n" | 
					
						
							| 
									
										
										
										
											2007-08-25 09:45:28 +02:00
										 |  |  | 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). | 
					
						
							| 
									
										
										
										
											2010-06-02 13:56:36 -07:00
										 |  |  | 	sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i | 
					
						
							| 
									
										
										
										
											2007-08-25 09:45:28 +02:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-08-23 00:25:24 +04:00
										 |  |  | 		printf "$files: \t$symb\n" | 
					
						
							| 
									
										
										
										
											2007-08-25 09:45:28 +02:00
										 |  |  | 	fi | 
					
						
							|  |  |  | done|sort |