summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPeter Rosin <peda@lysator.liu.se>2013-01-22 22:54:43 +0100
committerPeter Rosin <peda@lysator.liu.se>2013-01-22 22:54:43 +0100
commita5a4944fbb2bbd20adb12bd357d3b41e9a44b246 (patch)
tree002f4a1c0fe337e912b371d18eef4a8a488fc0aa /tests
parent726bf31ced115a9c21470c340ef7fda2f2992544 (diff)
downloadlibtool-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-xtests/export-def.at139
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