| #!/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 |