10bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso#!/bin/sh 20bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Find Kconfig variables used in source code but never defined in Kconfig 30bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Copyright (C) 2007, Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> 40bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso 50bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Tested with dash. 60bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussopaths="$@" 70bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso[ -z "$paths" ] && paths=. 80bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso 90bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Doing this once at the beginning saves a lot of time, on a cache-hot tree. 100bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' GiarrussoKconfigs="`find . -name 'Kconfig' -o -name 'Kconfig*[^~]'`" 110bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso 12a3ee9470e6ccce28b5c2a1c098a5ee5aa053c668Amerigo Wang/bin/echo -e "File list \tundefined symbol used" 130bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussofind $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while read i 140bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodo 150bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # Output the bare Kconfig variable and the filename; the _MODULE part at 160bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # the end is not removed here (would need perl an not-hungry regexp for that). 1703b550d3f9faf912d935ea310363e8e96d3aeeeaRoland Dreier sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i 180bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodone | \ 190bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# Smart "sort|uniq" implemented in awk and tuned to collect the names of all 200bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso# files which use a given symbol 210bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussoawk '{map[$1, count[$1]++] = $2; } 220bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' GiarrussoEND { 230bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso for (combIdx in map) { 240bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso split(combIdx, separate, SUBSEP); 250bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # The value may have been removed. 260bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso if (! ( (separate[1], separate[2]) in map ) ) 270bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso continue; 280bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso symb=separate[1]; 290bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso printf "%s ", symb; 300bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso #Use gawk extension to delete the names vector 310bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso delete names; 320bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso #Portably delete the names vector 330bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso #split("", names); 340bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso for (i=0; i < count[symb]; i++) { 350bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso names[map[symb, i]] = 1; 360bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # Unfortunately, we may still encounter symb, i in the 370bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # outside iteration. 380bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso delete map[symb, i]; 390bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso } 400bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso i=0; 410bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso for (name in names) { 420bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso if (i > 0) 430bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso printf ", %s", name; 440bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso else 450bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso printf "%s", name; 460bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso i++; 470bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso } 480bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso printf "\n"; 490bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso } 500bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso}' | 510bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussowhile read symb files; do 520bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # Remove the _MODULE suffix when checking the variable name. This should 530bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # be done only on tristate symbols, actually, but Kconfig parsing is 540bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso # beyond the purpose of this script. 550bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso symb_bare=`echo $symb | sed -e 's/_MODULE//'` 560bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso if ! grep -q "\<$symb_bare\>" $Kconfigs; then 57a3ee9470e6ccce28b5c2a1c098a5ee5aa053c668Amerigo Wang /bin/echo -e "$files: \t$symb" 580bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrusso fi 590bce67352b580e9025059ecc71e13e0ffd281254Paolo 'Blaisorblade' Giarrussodone|sort 60