#!/bin/sh # # feature-check: This script looks for feature statements in a file by # executing a compiler under CPP and extracting lines of the following # form: # # netsnmp_feature_provides(foo): used to indicate it provides feature "foo" # netsnmp_feature_require(bar): used to indicate it requires feature "bar" # netsnmp_feature_want(bar): used to indicate it wants feature "bar" # (but can live without it) # # Using these lines it then generates a list of feature requirement # defines in "include/net-snmp/net-snmp-features.h" which can then be # loaded in later passes at compile time. # # Defines produced when netsnmp_featre_require(bar) is present: # #define NETSNMP_FEATURE_REQUIRE_BAR 1 # # Defines produced when netsnmp_feature_want(bar) is present: # #define NETSNMP_FEATURE_WANT_BAR 1 # # And when all the features have been collected, they are also inverted via # the feature-post-check script: # # #define NETSNMP_FEATURE_REMOVE_BARX 1 /* never required */ # #undef NETSNMP_FEATURE_REMOVE_BAR /* required */ # Usage: # feature-check NORMAL-COMPILE-LINE SED=sed GREP=grep CC=gcc RM=rm if test "x$1" = "x--feature-global" ; then # a global file should be included shift global=$1 shift fi sourcedir=$1 shift source=$1 shift destination=$1 shift tmpf="$destination.1" compileline="$@" $compileline '-DNETSNMP_FEATURE_CHECKING=1' \ '-DNETSNMP_MINIMAL_CODE=1' \ '-Dnetsnmp_feature_require(X)=X NSF_RR' \ '-Dnetsnmp_feature_provide(X)=X NSF_PP' \ '-Dnetsnmp_feature_child_of(X,Y)=X,Y NSF_CO' \ '-Dnetsnmp_feature_want(X)=X NSF_WW' $source | \ $GREP NSF_ | $GREP -v '^#define' > $tmpf $RM -f $destination; touch $destination; # process requires firstrequire=1 for i in `grep NSF_RR $tmpf | sed 's/ NSF_RR;//'` ; do if test $firstrequire = 1 ; then echo "" >> $destination echo "/* required by $sourcedir/$source */" >> $destination firstrequire=0 fi upper=`echo $i | tr a-z A-Z` echo "#define NETSNMP_FEATURE_REQUIRE_$upper 1" >> $destination done # process provides firstfeature=1 for i in `grep NSF_PP $tmpf | sed 's/ NSF_PP;//'` ; do if test $firstfeature = 1 ; then echo "" >> $destination echo "/* features provided by $sourcedir/$source */" >> $destination firstfeature=0 fi upper=`echo $i | tr a-z A-Z` echo "#define NETSNMP_FEATURE_PROVIDE_$upper 1" >> $destination done # process children firstfeature=1 for i in `grep NSF_CO $tmpf | sed 's/ NSF_CO;//'` ; do parent=`echo $i | sed 's/.*,//'` child=`echo $i | sed 's/,.*//'` if test $firstfeature = 1 ; then echo "" >> $destination echo "/* features provided by $sourcedir/$source */" >> $destination firstfeature=0 fi upperchild=`echo $child | tr a-z A-Z` upperparent=`echo $parent | tr a-z A-Z` echo "#define NETSNMP_FEATURE_${upperchild}_CHILD_OF_${upperparent} 1" >> $destination echo "#define NETSNMP_FEATURE_PROVIDE_$upperchild 1" >> $destination done # process wants firstfeature=1 for i in `grep NSF_WW $tmpf | sed 's/ NSF_WW;//'` ; do if test $firstfeature = 1 ; then echo "" >> $destination echo "/* features wanted by $sourcedir/$source */" >> $destination firstfeature=0 fi upper=`echo $i | tr a-z A-Z` echo "#define NETSNMP_FEATURE_WANT_$upper 1" >> $destination done if test "x$global" != "x" ; then cat $destination >> $global fi # clean up #$RM -f $tmpf