| # need-lib-prefix.at -- test libltdl functionality -*- Autotest -*- |
| # |
| # Copyright (C) 2007-2008, 2010-2019, 2021-2025 Free Software |
| # Foundation, Inc. |
| # Written by Gary V. Vaughan, 2007 |
| # |
| # 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([enforced lib prefix]) |
| AT_KEYWORDS([libltdl libtool]) |
| |
| # Originally written to simulate a failure visible on systems |
| # that need a library prefix like 'lib', such as BeOS. Currently |
| # the prefix is hardcoded as 'lib', so systems that require a |
| # different prefix skips the test. |
| |
| AT_DATA([main.c], |
| [[#include <ltdl.h> |
| #include <stdio.h> |
| |
| typedef int fun (int); |
| |
| static int errors = 0; |
| |
| static void |
| complain (const char *msg) |
| { |
| const char *errmsg = lt_dlerror (); |
| fprintf (stderr, "%s", msg); |
| if (errmsg) |
| fprintf (stderr, ": %s\n", errmsg); |
| else |
| fprintf (stderr, ".\n"); |
| ++errors; |
| } |
| |
| static lt_dlhandle |
| moduleopen (const char *filename) |
| { |
| lt_dlhandle handle; |
| |
| handle = lt_dlopen (filename); |
| if (!handle) |
| { |
| fprintf (stderr, "can't open the module %s!\n", filename); |
| complain ("error was"); |
| } |
| |
| return handle; |
| } |
| |
| static int |
| moduletest (lt_dlhandle handle) |
| { |
| const lt_dlinfo *info = lt_dlgetinfo (handle); |
| fun *f = (fun *) lt_dlsym (handle, "f"); |
| int *v = (int *) lt_dlsym (handle, "i"); |
| |
| if (!f) |
| { |
| complain ("function 'f' not found"); |
| return 1; |
| } |
| if (!v) |
| { |
| complain ("variable 'i' not found"); |
| return 1; |
| } |
| printf ("%s: %d\n", info->name, f (*v)); |
| |
| return 0; |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| lt_dlhandle handle; |
| |
| LTDL_SET_PRELOADED_SYMBOLS(); |
| |
| if (lt_dlinit() != 0) |
| { |
| fprintf (stderr, "error during initialization: %s\n", lt_dlerror()); |
| return 1; |
| } |
| |
| if (lt_dlpreload_open (0, moduletest) != 0) |
| complain ("error during preloading"); |
| |
| if (lt_dlexit () != 0) |
| complain ("error during exit"); |
| |
| return (errors != 0); |
| } |
| ]]) |
| |
| AT_DATA([foo1.c], |
| [[#define f foo1_LTX_f |
| #define i foo1_LTX_i |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| int f (int x) { return x / 3; } |
| int i = 7; |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| |
| AT_DATA([foo2.c], |
| [[#define f libfoo2_LTX_f |
| #define i libfoo2_LTX_i |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| int f (int x) { return (x * x) / 10; } |
| int i = 6; |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| |
| LT_AT_HOST_DATA([expout], |
| [[libfoo1: 2 |
| libfoo2: 3 |
| ]]) |
| |
| : ${LTDLINCL="-I$abs_top_srcdir/libltdl"} |
| : ${LIBLTDL="$abs_builddir/../libltdl/libltdlc.la"} |
| |
| # Skip this test when called from: |
| # make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-ltdl-install |
| AT_CHECK([case $LIBLTDL in #( |
| */_inst/lib/*) test -f "$LIBLTDL" || (exit 77) ;; |
| esac], [], [ignore]) |
| |
| CPPFLAGS="$LTDLINCL $CPPFLAGS" |
| LDFLAGS=$LDFLAGS |
| |
| # Skip this test when libraries are not normally prefixed with lib. |
| # E.g., for MSVC and OS/2. |
| eval "`$LIBTOOL --config | $EGREP '^(libname_spec)='`" |
| name= |
| eval libname=\"$libname_spec\" |
| AT_CHECK([test lib = "$libname" || exit 77]) |
| |
| # Create our own libtool, forcing need_lib_prefix setting |
| $SED 's|^\(need_lib_prefix\)=.*$|\1=unknown|' $LIBTOOL > ./libtool |
| LIBTOOL="$SHELL ./libtool" |
| |
| # Installation directory: |
| instdir=`pwd`/_inst |
| |
| $CC $CPPFLAGS $CFLAGS -c main.c |
| for file in foo1 foo2; do |
| $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file.c |
| done |
| |
| AT_CHECK([$LIBTOOL --mode=link $CC -module -avoid-version $CFLAGS $LDFLAGS -o foo1.la foo1.lo -rpath $instdir/lib], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC -module -avoid-version $CFLAGS $LDFLAGS -o libfoo2.la foo2.lo -rpath $instdir/lib], |
| [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main$EXEEXT main.$OBJEXT -dlpreopen foo1.la -dlpreopen libfoo2.la $LIBLTDL], |
| [], [ignore], [ignore]) |
| |
| LT_AT_NOINST_EXEC_CHECK([./main], [-dlopen foo1.la -dlopen libfoo2.la], |
| [], [expout], []) |
| |
| # Install the libraries. |
| mkdir $instdir |
| mkdir $instdir/lib |
| $LIBTOOL --mode=install cp foo1.la $instdir/lib/foo1.la |
| $LIBTOOL --mode=install cp libfoo2.la $instdir/lib/libfoo2.la |
| |
| # Install the binary |
| mkdir $instdir/bin |
| $LIBTOOL --mode=install cp main$EXEEXT $instdir/bin/main$EXEEXT |
| |
| LT_AT_EXEC_CHECK([$instdir/bin/main], [], [expout], []) |
| |
| AT_CLEANUP |