diff options
author | Peter Rosin <peda@lysator.liu.se> | 2013-01-22 22:54:43 +0100 |
---|---|---|
committer | Peter Rosin <peda@lysator.liu.se> | 2013-01-22 22:54:43 +0100 |
commit | a5a4944fbb2bbd20adb12bd357d3b41e9a44b246 (patch) | |
tree | 002f4a1c0fe337e912b371d18eef4a8a488fc0aa /tests | |
parent | 726bf31ced115a9c21470c340ef7fda2f2992544 (diff) | |
download | libtool-a5a4944fbb2bbd20adb12bd357d3b41e9a44b246.tar.gz |
libtool: factor out the dll .def file test and improve it
Resolves bug#13414. Problem reported by Erik van Pienbroek
and Martin Doucha.
build-aux/ltmain.in (func_mode_link): Factor out the test if a
given symbol file is a module-definition (.def) file into...
(func_dll_def_p): ...this function, which also improves the check.
m4/libtool.m4 (_LT_LINKER_SHLIBS, _LT_LANG_CXX_CONFIG)
<cygwin, mingw, pw32, cegcc>: Similarly, factor out the test if
a given symbol file is a module-definition (.def) file into...
(_LT_DLL_DEF_P): ...this macro, which also improves the check.
tests/export-def.at: New test.
Makefile.am (TESTSUITE_AT): Add above test.
NEWS: Update.
THANKS: Update.
Signed-off-by: Peter Rosin <peda@lysator.liu.se>
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/export-def.at | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/export-def.at b/tests/export-def.at new file mode 100755 index 00000000..55a513ab --- /dev/null +++ b/tests/export-def.at @@ -0,0 +1,139 @@ +# export-def.at -- test module-definition files -*- Autotest -*- + +# Copyright (C) 2013 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; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +#### + +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 |