#!/bin/sh exstat=1 trap 'rm -f Makefile dummy ../dummy.o dummy.exe testfunc.c testfunc ../testfunc.o testfunc.exe; exit $exstat' 0 1 2 3 15 # # Yet another Apache Configure helper script. # This script tests certain aspects of the compilation # process. Right now, it can perform 5 tests: # # ./helpers/TestCompile lib <libname> # Which checks to see if <libname> exists on this system # # ./helpers/TestCompile lib <libname> <func> # Which checks to see if <libname> exists on this system and # contains func. # # ./helpers/TestCompile func <function> # Which checks to see if <function> exists # # ./helpers/TestCompile header <header> # Which checks to see if header file <header> exists # # ./helpers/TestCompile sanity # Which does a simple sanity check/test compile # # ./helpers/TestCompile sizeof <type> # Which prints out the sizeof <type> (sure would be nice # if sizeof could be use in preprocessor if's) # # ./helpers/TestCompile byteorder # Which prints out the byte order of the machine # (12: little endian, 21: big endian) # # It does these by creating a small mini-makefile, based on # ../Makefile.config and trying to compile a small dummy # program. If the compilation succeeds, we assume the test # was successful as well. # # This must be run as './helpers/TestCompile' from # the ./src directory (same directory that Configure is # located) if you want to test it out. Configure must # also call it as './helpers/TestCompile' # # # INVOCATION SWITCHES: # TestCompile evaluates the following switches # (currently, it accepts only *ONE* of them!): # # -v (enable verbose operation) # Enables VERBOSE=yes, see below. # # -s (enforce silent operation) # Override a VERBOSE=yes, force it to VERBOSE=no. # # -r (run generated test program) # Enables TCRUNIT=yes, see below # # # ENVIRONMENT VARIABLES: # The following environment variables have influence on # TestCompile's operation: # # $VERBOSE (yes|no; default=no) # If set to "yes", will print compiler messages to stderr # Otherwise, stderr of all invoked programs is sent to /dev/null # # $TCRUNIT (yes|no; default=no) # (This variable is obsoleted by the "-r" switch) # If set to "yes", will invoke the test program which was # generated by TestCompile. Useful for "TestCompile sizeof" # and "TestCompile byteorder" tests. # Otherwise, TestCompile only tests for the presence of a # generated program when deciding whether the compilation was # successful. # # $TCADDINCL (#include <> stmt list; default=empty) # If set to an "#include <file>" preprocessor directive # (optionally several #include's separated by newlines), these # directives will be added to the generated test sources. # That allows, e.g., the "TestCompile sizeof" test to check for # types which are not defined in the standard locations. # # $TLIB (additional libraries; default=empty) # If set to a list of additional libraries, these libs will be used # in addition to the one tested by the "TestCompile lib" call. # For the other TestCompile tests, it is ignored. # # # Initially written by Jim Jagielski for the Apache configuration mechanism # # This script falls under the Apache License. # See http://www.apache.org/docs/LICENSE cd ./helpers # # Handle "verbose", "silent" and "runit" flags. Allow for them # to be set via the environment # if [ "x$VERBOSE" = "x" ]; then VERBOSE="no" fi if [ "x$TCRUNIT" = "x" ]; then TCRUNIT="no"; fi case "$1" in "-v") VERBOSE="yes" shift ;; "-s") VERBOSE="no" shift ;; "-r") TCRUNIT="yes" shift ;; esac # # Make sure we have the right arguments # case "$1" in "lib") if [ "x$2" = "x" ]; then exit fi TLIB="-l$2 $TLIB" if [ "x$VERBOSE" = "xyes" ]; then ERRDIR="" else ERRDIR='2>/dev/null' fi if [ "x$3" = "x" ]; then TARGET='dummy' else TARGET='testfunc' echo "int main(void) { $3(); return(0); }" > testfunc.c fi ;; "sizeof") if [ "x$2" = "x" ]; then exit fi TLIB="" if [ "x$VERBOSE" = "xyes" ]; then ERRDIR="" else ERRDIR='2>/dev/null' fi TARGET='testfunc' cat <<EOF >testfunc.c #include <stdio.h> #include <sys/types.h> $TCADDINCL int main(void) { printf("%d\n", sizeof($2)); return(0); } EOF ;; "byteorder") TLIB="" if [ "x$VERBOSE" = "xyes" ]; then ERRDIR="" else ERRDIR='2>/dev/null' fi TARGET='testfunc' cat <<EOF >testfunc.c #include <stdio.h> #include <sys/types.h> $TCADDINCL int main(void) { /* Are we little or big endian? From Harbison & Steele */ union { long l; char c[sizeof(long)]; } u; u.l = 1; printf("%s\n", u.c[sizeof(long)-1] == 1 ? "21" : "12"); return(0); } EOF ;; "sanity") TLIB="" if [ "x$VERBOSE" = "xno" ]; then ERRDIR='2>/dev/null' else ERRDIR="" fi TARGET='dummy' ;; "func") if [ "x$2" = "x" ]; then exit fi TLIB="" if [ "x$VERBOSE" = "xyes" ]; then ERRDIR="" else ERRDIR='2>/dev/null' fi TARGET='testfunc' cat <<EOF >testfunc.c $TCADDINCL int main(void) { $2(); return(0); } EOF ;; "header") if [ "x$2" = "x" ]; then exit fi TLIB="" if [ "x$VERBOSE" = "xyes" ]; then ERRDIR="" else ERRDIR='2>/dev/null' fi TARGET='testfunc' cat <<EOF >testfunc.c $TCADDINCL #include <$2> int main(void) { return(0); } EOF ;; *) exit ;; esac # # Get makefile settings and build a basic Makefile # rm -f dummy ../dummy.o testfunc ../testfunc.o cat ../Makefile.config > Makefile cat <<EOF >> Makefile CFLAGS=\$(OPTIM) \$(CFLAGS1) \$(EXTRA_CFLAGS) LIBS=\$(EXTRA_LIBS) \$(LIBS1) INCLUDES=\$(INCLUDES1) \$(EXTRA_INCLUDES) LDFLAGS=\$(LDFLAGS1) \$(EXTRA_LDFLAGS) dummy: cd ..; \$(CC) \$(CFLAGS) \$(INCLUDES) \$(LDFLAGS) -o helpers/dummy helpers/dummy.c $TLIB \$(LIBS) testfunc: cd ..; \$(CC) \$(CFLAGS) \$(INCLUDES) \$(LDFLAGS) -o helpers/testfunc helpers/testfunc.c $TLIB \$(LIBS) EOF # Now run that Makefile eval "${MAKE-make} ${TARGET} $ERRDIR >&2" # And see if dummy exists and is executable, if so, then we # assume the condition we are testing for is good # # Use our PrintPath helper script using the "-p" option to # have PrintPath just search this directory. if ./PrintPath -s -p`pwd` $TARGET ; then if [ "x$OS" = "xMPE/iX" ]; then # clever hack to check for unresolved externals without actually # executing the test program if eval "callci run `pwd`/$TARGET\;stdin=\*notfound 2>&1 | /bin/grep ^UNRESOLVED $ERRDIR >&2"; then exit 1 # there were unresolved externals fi fi if [ "x$TCRUNIT" = "xyes" ]; then `pwd`/$TARGET fi exstat=0 fi