blob: ff8a4bc53170e9b011f3a21d152193f0429c8e2a [file] [log] [blame]
#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
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