diff options
| author | Kris Kennaway <kris@FreeBSD.org> | 2001-03-05 12:18:27 +0000 |
|---|---|---|
| committer | Kris Kennaway <kris@FreeBSD.org> | 2001-03-05 12:18:27 +0000 |
| commit | dd51a35919c2100154118dcdbe4f4b5832202be5 (patch) | |
| tree | 22a277ebdeb7e8c053f978cfd363554c8cc2d1e1 /tools | |
| parent | de409c8025b3ede0d8ee85ff7a4445ed1c584c30 (diff) | |
Notes
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/tools/kerninclude/kerninclude.sh | 400 |
1 files changed, 220 insertions, 180 deletions
diff --git a/tools/tools/kerninclude/kerninclude.sh b/tools/tools/kerninclude/kerninclude.sh index abf8dc3cdcf7..a15d6b95d079 100644 --- a/tools/tools/kerninclude/kerninclude.sh +++ b/tools/tools/kerninclude/kerninclude.sh @@ -11,124 +11,24 @@ # This script tries to find #include statements which are not needed in # the FreeBSD kernel tree. # -# For each include file on the tasklist (set in $includes right below) -# For each object file (see around line 170 for how these are selected) -# For each kernel (set in $kernels right below) and all modules -# if the object exists -# figure out the sourcefile -# if the sourcefile doesn't contain "#include $include" -# continue -# if object can be compile without $include existing -# continue /* probably protected by #ifdef something */ -# if object can't be compile with empty file for $include -# continue /* needed something/ -# if the compiler warnings/errors were different than normal -# continue /* needed something/ -# if the resulting object were different than normal -# continue /* needed something */ -# /* didn't need this include */ -# remove $include from source file -# -# Takes about 12h to run on a PII/400 -# -# NOTE: /usr/include is mucked about with!! -# set -e # Base of the kernel sources you want to work on -cd /some/sourcetree/sys +cd /sys # Set to true to start from scratch, false to resume -init=true +init=false # Which kernels you want to check kernels="LINT GENERIC GENERIC98" -# Which includes you want to check -includes="*/*.h i386/*/*.h dev/*/*.h cam/scsi/*.h ufs/*/*.h pc98/*/*.h netatm/*/*.h i4b/*/*.h" - -check_it () -{ - if [ -f ::$2 ] ; then - if grep "#[ ]*include[ ].$1." ::$2 > /dev/null; then - src=`ls -l ::$2 | awk '{print $11}'` - else - echo " -" - exit 0 - fi - else - rm -f $2 - make -n $2 > _0 2>&1 || true - src=`awk '$1 == "cc" {print $NF}' _0` - if expr "x$src" : 'x.*\.c$' > /dev/null ; then - ln -s $src ::$2 - else - echo " not C source" - # don't create $2, we don't care about it. - exit 0 - fi - if grep "#[ ]*include[ ].$1." $src > /dev/null; then - true - else - echo " -" - touch $2 - exit 0 - fi - fi - rm ../../$1 - rm -f $2 - if [ -f /usr/include/$1 ] ; then - mv /usr/include/$1 /usr/include/${1}_ - make $2 > _0 2>&1 || true - mv /usr/include/${1}_ /usr/include/$1 - else - make $2 > _0 2>&1 || true - fi - echo > ../../$1 - if [ -f $2 ] ; then - echo " no read" - cp ../../${1}_ ../../$1 - exit 0 - fi - - make $2 > _1 2>&1 || true - - cp ../../${1}_ ../../$1 - - if [ ! -f $2 ] ; then - echo " compile error" - touch $2 - exit 0 - fi - m2=`md5 < $2` - - rm $2 - make $2 > _0 2>&1 || true - if [ ! -f $2 ] ; then - echo "$2 reference compile failed" - touch $2 - cat _0 - exit 0 - fi - m1=`md5 < $2` - - if cmp _0 _1 > /dev/null 2>&1 ; then - true - else - echo " warnings changed" - exit 0 - fi - - if [ $m1 != $m2 ] ; then - echo " MD5 changed" - exit 0 - fi -} - +NO_MODULES=yes +export NO_MODULES if $init ; then ( + echo "Cleaning modules" cd modules make clean > /dev/null 2>&1 make cleandir > /dev/null 2>&1 @@ -138,45 +38,60 @@ if $init ; then ) ( + echo "Cleaning compile" cd compile ls | grep -v CVS | xargs rm -rf ) +fi - ( - cd i386/conf - for i in $kernels - do - if [ -f $i ] ; then - config -r $i - fi - done - cd ../../pc98/conf - for i in $kernels - do - if [ -f $i ] ; then - config -r $i - fi - done - ) +( +echo "Cleaning temp files" +find . -name '*.h_' -print | xargs rm -f +find . -name '::*' -print | xargs rm -f +find . -name '*.o' -size 0 -print | xargs rm -f +) - for i in $kernels - do - ( - echo "Compiling $i" - cd compile/$i - rm -f ::* - make -k > x.0 2>&1 - tail -4 x.0 - ) - done +echo "Configuring kernels" +( + cd i386/conf + make LINT + if $init ; then + config -r LINT + config -r GENERIC + else + config LINT + config GENERIC + fi +) +( + cd pc98/conf + cp -f GENERIC GENERIC98 + if $init ; then + config -r GENERIC98 + else + config GENERIC98 + fi +) +for i in $kernels +do ( - echo "Compiling modules" - cd modules - rm -f */::* - make -k > x.0 2>&1 || true + echo "Compiling $i" + cd compile/$i + make > x.0 2>&1 + tail -4 x.0 + if [ ! -f kernel ] ; then + echo "Error: No $i kernel built" + exit 1 + fi ) -fi +done + +( +echo "Compiling modules" +cd modules +make > x.0 2>&1 +) # Generate the list of object files we want to check # you can put a convenient grep right before the sort @@ -200,67 +115,192 @@ done /vers.o/d /setdef0.o/d /setdef1.o/d -/::/d ' | sort -u > _ objlist=`cat _` -find . -name '*.h_' -print | xargs rm -f -for incl in $includes +for o in $objlist do - if [ ! -f ${incl} ] ; then + l="" + src="" + for k in $kernels + do + if [ ! -f compile/$k/$o ] ; then + continue; + fi + l="$l compile/$k" + if [ "x$src" = "x" ] ; then + cd compile/$k + mv $o ${o}_ + make -n $o > _ + mv ${o}_ $o + src=compile/$k/`awk '$1 == "cc" {print $NF}' _` + cd ../.. + if expr "x$src" : 'x.*\.c$' > /dev/null ; then + true + else + echo NO SRC $o + src="" + fi + fi + done + for m in modules/* + do + if [ ! -d $m -o ! -f $m/$o ] ; then + continue; + fi + l="$l $m" + if [ "x$src" = "x" ] ; then + cd $m + mv $o ${o}_ + make -n $o > _ + mv ${o}_ $o + src=`awk '$1 == "cc" {print $NF}' _` + cd ../.. + if expr "x$src" : 'x.*\.c$' > /dev/null ; then + if [ "`dirname $src`" = "." ] ; then + src="$m/$src" + fi + true + else + echo NO SRC $o + src="" + fi + fi + done + if [ "x$src" = "x" ] ; then + echo "NO SOURCE $o" continue fi - if [ ! -f ${incl}_ ] ; then - cp $incl ${incl}_ - fi - for obj in $objlist + echo "OBJ $o" + echo " SRC $src" + + grep -n '^[ ]*#[ ]*include' $src | sed ' + s/^\([0-9]*\):[ ]*#[ ]*include[ ]*[<"]/\1 / + s/[">].*// + / opt_/d + ' | sort -rn | while read lin incl do - ( - echo -n "$incl $obj:" - src="" + S="" + echo " INCL $lin $incl" + cp $src ${src}_ + + # Check if we can compile without this #include line. - cd compile - for i in $kernels + sed "${lin}s/.*//" ${src}_ > ${src} + for t in $l do - cd $i + cd $t + mv ${o} ${o}_ + if make ${o} > _log 2>&1 ; then + if cmp -s ${o} ${o}_ ; then + echo " $t same object" + else + echo " $t changed object" + S=TAG + fi + else + echo " $t used" + S=TAG + fi + mv ${o}_ ${o} + cd ../.. + if [ "x$S" != "x" ] ; then + break + fi + done + if [ "x$S" != "x" ] ; then + mv ${src}_ ${src} + continue + fi + + # Check if this is because it is a nested #include + for t in $l + do + cd $t + rm -rf foo + mkdir -p foo/${incl} + rmdir foo/${incl} + touch foo/${incl} + mv ${o} ${o}_ + if make INCLMAGIC=-Ifoo ${o} > _log2 2>&1 ; then + if cmp -s ${o} ${o}_ ; then + echo " $t still same object" + else + echo " $t changed object" + S=TAG + fi + else + echo " $t nested include" + S=TAG + fi + rm -rf foo + mv ${o}_ ${o} + cd ../.. + if [ "x$S" != "x" ] ; then + break + fi + done + if [ "x$S" != "x" ] ; then + mv ${src}_ ${src} + continue + fi + + # Check if this is because it is #ifdef'ed out - if [ ! -f $obj ] ; then - cd .. - continue + sed "${lin}s/.*/#error \"BARF\"/" ${src}_ > ${src} + for t in $l + do + cd $t + mv ${o} ${o}_ + if make ${o} > /dev/null 2>&1 ; then + echo " $t line not read" + S=TAG + fi + mv ${o}_ ${o} + cd ../.. + if [ "x$S" != "x" ] ; then + break fi - echo -n " [$i]" - check_it $incl $obj - cd .. done - cd .. - cd modules - for d in */$obj + + mv ${src}_ ${src} + if [ "x$S" != "x" ] ; then + continue + fi + + # Check if the warnings changed. + + for t in $l do - if [ ! -f $d ] ; then - continue + cd $t + mv ${o} ${o}_ + if make ${o} > _ref 2>&1 ; then + if cmp -s _ref _log ; then + echo " $t same warnings" + else + echo " $t changed warnings" + S=TAG + fi + else + echo "ARGHH!!!" + exit 9 + fi + + mv ${o}_ ${o} + cd ../.. + if [ "x$S" != "x" ] ; then + break fi - b=`dirname $d` - echo -n " [$b]" - cd $b - check_it $incl $obj - cd .. done - cd .. - if [ "x$src" = "x" ] ; then - echo " -" - exit 0 + if [ "x$S" != "x" ] ; then + continue fi - echo -n " ($src)" - echo " BINGO!" - echo "$incl $src" >> _incl - ( - cd compile/LINT - grep -v "#[ ]*include[ ]*.$incl." $src > ${src}_ - mv ${src}_ $src - ) - ) + cp $src ${src}_ + sed "${lin}d" ${src}_ > ${src} + rm ${src}_ + touch _again + echo "BINGO $src $lin $incl $obj $l" done done - |
