| # export-def.at -- test module-definition files -*- Autotest -*- |
| |
| # Copyright (C) 2013-2019, 2021-2025 Free Software Foundation, Inc. |
| # Written by Peter Rosin, 2013 |
| # |
| # 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([export from a DLL with a .def file]) |
| AT_KEYWORDS([libtool]) |
| |
| AT_CHECK([$LIBTOOL --features | $GREP 'disable shared libraries' && (exit 77)], |
| [1], [ignore]) |
| eval `$LIBTOOL --config | $EGREP '^(shrext_cmds|libname_spec|soname_spec)='` |
| |
| eval shared_ext=\"$shrext_cmds\" |
| |
| # skip if not building a .dll |
| AT_CHECK([test .dll = "$shared_ext" || (exit 77)]) |
| |
| LDFLAGS="$LDFLAGS -no-undefined" |
| libdir=`pwd`/inst/lib |
| mkdir inst inst/lib |
| |
| AT_DATA([a.c], |
| [[/* a */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| int v1 = -1; |
| int v2 (void) { return -2; } |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| ]]) |
| |
| AT_DATA([syms], |
| [[v1 |
| v2 |
| ]]) |
| |
| AT_DATA([def1], |
| [[EXPORTS |
| v1 DATA |
| v2 |
| ]]) |
| |
| AT_DATA([def2], |
| [[; Def file |
| ; with some very important comments |
| EXPORTS |
| v1 DATA |
| v2 |
| ]]) |
| |
| AT_DATA([def3], |
| [[ |
| EXPORTS v1 DATA |
| v2 |
| ]]) |
| |
| AT_DATA([def4], |
| [[ LIBRARY %soname% |
| EXPORTS |
| v1 DATA |
| v2 |
| ]]) |
| |
| AT_DATA([main.c], |
| [[ |
| /* w32 fun. With GCC, you can have auto-import, which will work for |
| * functions and non-const variables. With MSVC, you have to explicitly |
| * import all variables. |
| * |
| * For users, it's best to realize that they should not provide any |
| * non-function API at all. |
| */ |
| #if defined LIBA_DLL_IMPORT |
| # if defined _WIN32 && defined _MSC_VER |
| # define LIBA_SCOPE_VAR extern __declspec(dllimport) |
| # endif |
| #endif |
| #if !defined LIBA_SCOPE_VAR |
| # define LIBA_SCOPE_VAR extern |
| #endif |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| LIBA_SCOPE_VAR int v1; |
| extern int v2(void); |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| int main (void) |
| { |
| return v1 + v2() + 3; |
| } |
| ]]) |
| |
| name=a |
| eval libname=\"$libname_spec\" |
| major=0 |
| versuffix=-$major |
| eval soname=\"$soname_spec\" |
| |
| AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c a.c],[0],[ignore],[ignore]) |
| AT_CHECK([$CC $CPPFLAGS -DLIBA_DLL_IMPORT $CFLAGS -c main.c],[0],[ignore],[ignore]) |
| |
| for exportsyms in syms def1 def2 def3 def4 |
| do |
| $SED "s/%soname%/$soname/" -i $exportsyms |
| |
| LT_AT_CHECK([eval '$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la a.lo \ |
| -rpath $libdir' -export-symbols $exportsyms], [], [ignore], [ignore]) |
| AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main$EXEEXT main.$OBJEXT liba.la], |
| [], [ignore], [ignore]) |
| LT_AT_EXEC_CHECK([./main]) |
| done |
| |
| AT_CLEANUP |