| # ltdl-libdir.at -- test libltdl functionality -*- Autotest -*- |
| # |
| # Copyright (C) 2010-2019, 2021-2025 Free Software Foundation, Inc. |
| # This file is part of GNU Libtool. |
| # |
| # GNU Libtool 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 of |
| # the License, or (at your option) any later version. |
| # |
| # GNU Libtool 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 GNU Libtool. If not, see <https://www.gnu.org/licenses/>. |
| #### |
| |
| AT_SETUP([libdir of installed modules]) |
| AT_KEYWORDS([libltdl]) |
| |
| # This test requires shared library support. |
| AT_CHECK([$LIBTOOL --features | $GREP 'enable shared libraries' || exit 77], |
| [], [ignore]) |
| |
| # With MinGW, try Windows-style paths only. |
| if pwd -W >/dev/null 2>&1; then |
| prefix=`pwd -W`/inst |
| else |
| prefix=`pwd`/inst |
| fi |
| libdir=$prefix/lib |
| bindir=$prefix/bin |
| mkdir $prefix $libdir $bindir |
| |
| AT_DATA([a.c], |
| [[#ifdef __cplusplus |
| extern "C" |
| #endif |
| int f (void) |
| { |
| return 42; |
| } |
| ]]) |
| |
| AT_DATA([m.c], |
| [[ |
| #include <stdio.h> |
| #include <ltdl.h> |
| |
| typedef int func_f(void); |
| |
| int |
| main (int argc, const char *argv[]) |
| { |
| lt_dlhandle module = NULL; |
| func_f *f = NULL; |
| |
| if (lt_dlinit()) { |
| fprintf(stderr, "lt_dlinit failed '%s'\n", lt_dlerror()); |
| return 1; |
| } |
| |
| module = lt_dlopen("./a.la"); |
| |
| if (!module) { |
| fprintf(stderr, "lt_dlopen failed '%s'\n", lt_dlerror()); |
| return 1; |
| } |
| |
| f = (func_f *)lt_dlsym(module, "f"); |
| |
| if (!f) { |
| fprintf(stderr, "lt_dlsym failed '%s'\n", lt_dlerror()); |
| return 1; |
| } |
| |
| if (f() != 42) { |
| fprintf(stderr, "f did not return 42\n"); |
| return 1; |
| } |
| |
| lt_dlclose(module); |
| lt_dlexit(); |
| return 0; |
| } |
| ]]) |
| |
| : ${LTDLINCL="-I$abs_top_srcdir/libltdl"} |
| : ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"} |
| |
| # Skip installcheck if --disable-ltdl-install was used. |
| AT_CHECK([test -f "$LIBLTDL" || exit 77]) |
| |
| CPPFLAGS="$LTDLINCL $CPPFLAGS" |
| LDFLAGS="$LDFLAGS -no-undefined" |
| |
| AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c a.c], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o a.la ]dnl |
| [a.lo -rpath $libdir -module -shared -avoid-version], |
| [], [ignore], [ignore]) |
| AT_CHECK([$CC $CPPFLAGS $CFLAGS -c m.c], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o m$EXEEXT ]dnl |
| [m.$OBJEXT $LIBLTDL], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=install cp a.la $libdir/a.la], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=install cp m$EXEEXT $bindir/m$EXEEXT], |
| [], [ignore], [ignore]) |
| |
| # Try finding the module via the libdir entry in a misplaced .la file. |
| |
| mv $libdir/a.la $bindir/a.la |
| cd $bindir |
| LT_AT_EXEC_CHECK([./m], |
| [], [ignore], [ignore]) |
| |
| AT_CLEANUP |