libtool/tests/link-order2.at
Ralf Wildenhues 490d8a6e4f * tests/link-order2.at: Define our override `sin' function with
C binding even if $CC is a C++ compiler.  Skip the test with g++
as its command line driver reorders `-lm'.
* tests/search-path.at: Declare `inflate' with C binding.
* tests/stresstest.at: Avoid unused variable warnings.
2006-12-14 20:59:26 +00:00

106 lines
3.3 KiB
Plaintext

# Hand crafted tests for GNU Libtool. -*- Autotest -*-
# Copyright 2006 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# link-order2.test: make sure that depdepls are added right after
# the libs that pull them in: necessary at least for static linking
# and on systems where libraries do not link against other libraries,
# in order to do this: override a commonly used symbol in a commonly
# used library.
AT_SETUP([Link order of deplibs.])
AT_KEYWORDS([libtool])
# g++ reorders `-lm' on the command line. :-(
AT_DATA([t.c], [[
#if defined(__cplusplus) && defined(__GNUC__)
choke me
#endif
int t = 42;
]])
AT_CHECK([$CC $CPPFLAGS $CFLAGS -c t.c || exit 77], [], [ignore], [ignore])
LDFLAGS="$LDFLAGS -no-undefined"
libdir=`pwd`/inst/lib
bindir=`pwd`/inst/bin
mkdir inst inst/bin inst/lib
cat >a.c <<\EOF
/* pretend we have a better sine function */
#ifdef __cplusplus
extern "C"
#endif
double sin (double x) { return 0.0; }
EOF
cat >b.c <<\EOF
#ifdef __cplusplus
extern "C"
#endif
double sin (double);
double b (double x) { return sin (x); }
EOF
cat >main.c <<\EOF
#include <math.h>
#include <stdlib.h>
extern double b (double);
extern double four;
double four = 4.0;
int main (void)
{
/* The function b should call our sin (that returns 0) and not libm's
* (in the latter case, b returns approximately 1)
* the sqrt is to force linking against libm
* the variable four is to prevent most compiler optimizations
*/
int status = EXIT_FAILURE;
if (fabs (b (3.1415 / 2.)) < 0.01 && fabs (sqrt (four) - 2.) < 0.01)
status = EXIT_SUCCESS;
return status;
}
EOF
$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c a.c
$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c b.c
$CC $CPPFLAGS $CFLAGS -c main.c
for static in '' -static; do
$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS $static -o liba.la a.lo -rpath $libdir
$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS $static -o libb.la b.lo liba.la -rpath $libdir
$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT libb.la -lm
LT_AT_EXEC_CHECK([./main])
# Now test that if we reverse the link order, the program fails.
# The execution failure can only work on systems that actually have a libm.
$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o wrong main.$OBJEXT -lm libb.la
case $host_os in
cygwin* | mingw* | pw32* | beos* ) ;;
*) LT_AT_EXEC_CHECK([./wrong], [1]) ;;
esac
$LIBTOOL --mode=install cp liba.la $libdir/liba.la
$LIBTOOL --mode=install cp libb.la $libdir/libb.la
$LIBTOOL --mode=install cp main $bindir/main
$LIBTOOL --mode=clean rm -f liba.la libb.la
LT_AT_EXEC_CHECK([$bindir/main])
done
# Now the converse: if both the program and the library need libm, then
# it needs to be sorted last. (TODO)
AT_CLEANUP