mirror of
git://git.savannah.gnu.org/libtool.git
synced 2025-02-17 15:10:02 +08:00
shared library, define appropriate macros to expand __declspec(dllimport) on w32. Use two different main objects and pick the right one for the link flags we are about to test. Fixes test failure on MinGW.
270 lines
5.9 KiB
Plaintext
270 lines
5.9 KiB
Plaintext
# Hand crafted tests for GNU Libtool. -*- Autotest -*-
|
|
# Copyright 2005, 2006, 2007 Free Software Foundation, Inc.
|
|
|
|
# This program 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, or (at your option)
|
|
# any later version.
|
|
|
|
# This program 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 this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
# 02110-1301, USA.
|
|
|
|
# Test various flag and option combinations.
|
|
# Test linkage against objects in various sections.
|
|
|
|
# Note: This test is experimental, and might be too strict for some systems.
|
|
|
|
AT_BANNER([Libtool stress test.])
|
|
AT_SETUP([Link option thorough search test])
|
|
AT_KEYWORDS([libtool])
|
|
eval `$LIBTOOL --config | $EGREP '^(CC|objdir|allow_undefined_flag)='`
|
|
|
|
mkdir sub sub2 sub3 2>/dev/null
|
|
|
|
AT_DATA(a.c,
|
|
[[/* all kinds of data items */
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
int v1;
|
|
static int v2;
|
|
int v3 = 0;
|
|
int v4 = 1;
|
|
extern const int v5, v6;
|
|
extern const char *v7;
|
|
extern const char v8[];
|
|
extern int (*const v12) (void);
|
|
const int v5 = 0;
|
|
const int v6 = 1;
|
|
const char* v7 = "\01foo";
|
|
const char v8[] = "\01bar";
|
|
int v9(void) { return v2 + 1; }
|
|
int (*v10) (void);
|
|
int (*v11) (void) = v9;
|
|
int (*const v12) (void) = v9;
|
|
|
|
typedef struct { int arr[1000]; } large;
|
|
large v13;
|
|
large v14 = { { 0 } };
|
|
large v15 = { { 1 } };
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
]])
|
|
|
|
AT_DATA(asyms,
|
|
[[v1
|
|
v3
|
|
v4
|
|
v5
|
|
v6
|
|
v7
|
|
v8
|
|
v9
|
|
v10
|
|
v11
|
|
v12
|
|
v13
|
|
v14
|
|
v15
|
|
]])
|
|
|
|
AT_DATA(b.c,
|
|
[[int b = 42;
|
|
int b3 = 1;
|
|
int ab = 1;
|
|
]])
|
|
|
|
AT_DATA(main.c,
|
|
[[
|
|
#if defined(LIBA_DLL_IMPORT)
|
|
# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__)
|
|
# define LIBA_SCOPE extern __declspec(dllimport)
|
|
# endif
|
|
#endif
|
|
#if !defined(LIBA_SCOPE)
|
|
# define LIBA_SCOPE extern
|
|
#endif
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern int v1;
|
|
extern int v3, v4;
|
|
LIBA_SCOPE const int v5, v6;
|
|
extern const char* v7;
|
|
extern const char v8[];
|
|
extern int v9(void);
|
|
extern int (*v10) (void);
|
|
extern int (*v11) (void);
|
|
LIBA_SCOPE int (*const v12) (void);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
typedef struct { int arr[1000]; } large;
|
|
extern large v13, v14, v15;
|
|
|
|
int main(void)
|
|
{
|
|
char s = v7[0] + v8[0];
|
|
return s + v1 + v3 + v4 + v5 + v6 + v9() + v11() + v12()
|
|
+ v13.arr[0] + v14.arr[0] + v15.arr[0]
|
|
- 8;
|
|
}
|
|
]])
|
|
|
|
AT_DATA(dlself.c,
|
|
[[
|
|
#if defined(LIBA_DLL_IMPORT)
|
|
# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__)
|
|
# define LIBA_SCOPE extern __declspec(dllimport)
|
|
# endif
|
|
#endif
|
|
#if !defined(LIBA_SCOPE)
|
|
# define LIBA_SCOPE extern
|
|
#endif
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern int v1;
|
|
extern int v3, v4;
|
|
LIBA_SCOPE const int v5, v6;
|
|
extern const char* v7;
|
|
extern const char v8[];
|
|
extern int v9(void);
|
|
extern int (*v10) (void);
|
|
extern int (*v11) (void);
|
|
LIBA_SCOPE int (*const v12) (void);
|
|
|
|
typedef struct { int arr[1000]; } large;
|
|
extern large v13, v14, v15;
|
|
|
|
extern int w1;
|
|
extern int w3, w4;
|
|
extern const int w5, w6;
|
|
extern const char* w7;
|
|
extern const char w8[];
|
|
extern int w9(void);
|
|
extern int (*w10) (void);
|
|
extern int (*w11) (void);
|
|
extern int (*const w12) (void);
|
|
extern large w13, w14, w15;
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
int main(void)
|
|
{
|
|
char s = v7[0] + v8[0] + w7[0] + w8[0];
|
|
return s + v1 + v3 + v4 + v5 + v6 + v9() + v11() + v12()
|
|
+ v13.arr[0] + v14.arr[0] + v15.arr[0]
|
|
+ w1 + w3 + w4 + w5 + w6 + w9() + w11() + w12()
|
|
+ w13.arr[0] + w14.arr[0] + w15.arr[0]
|
|
- 16;
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
int w1;
|
|
static int w2;
|
|
int w3 = 0;
|
|
int w4 = 1;
|
|
const int w5 = 0;
|
|
const int w6 = 1;
|
|
const char* w7 = "\01foo";
|
|
const char w8[] = "\01bar";
|
|
int w9(void) { return w2 + 1; }
|
|
int (*w10) (void);
|
|
int (*w11) (void) = w9;
|
|
int (*const w12) (void) = w9;
|
|
large w13;
|
|
large w14 = { { 0 } };
|
|
large w15 = { { 1 } };
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
]])
|
|
|
|
AT_DATA(dlselfsyms,
|
|
[[w1
|
|
w3
|
|
w4
|
|
w5
|
|
w6
|
|
w7
|
|
w8
|
|
w9
|
|
w10
|
|
w11
|
|
w12
|
|
w13
|
|
w14
|
|
w15
|
|
]])
|
|
|
|
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c a.c -o sub/a.lo],
|
|
[0],[ignore],[ignore])
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c b.c -o sub/b.lo],
|
|
[0],[ignore],[ignore])
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS -DLIBA_DLL_IMPORT $CFLAGS -c main.c],
|
|
[0],[ignore],[ignore])
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c main.c -o main-static.lo],
|
|
[0],[ignore],[ignore])
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS -DLIBA_DLL_IMPORT $CFLAGS -c dlself.c -o sub3/dlself.lo],
|
|
[0],[ignore],[ignore])
|
|
AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c dlself.c -o sub3/dlself-static.lo],
|
|
[0],[ignore],[ignore])
|
|
|
|
case $allow_undefined_flag in
|
|
unsupported) undef_opts=-no-undefined ;;
|
|
*) undef_opts='"" -no-undefined' ;;
|
|
esac
|
|
|
|
# expose problems with the regex:
|
|
touch vfoo v.bar
|
|
|
|
for l1 in $undef_opts
|
|
do
|
|
for l2 in '' '-export-symbols-regex "v.*"' '-export-symbols asyms'
|
|
do
|
|
for l3 in '' '-rpath /nonexistent'
|
|
do
|
|
linkargs="$l1 $l2 $l3"
|
|
for rel in '' ./ `pwd`/
|
|
do
|
|
LT_AT_CHECK([eval '$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o "$rel"sub2/liba.la "$rel"sub/a.lo' $linkargs],
|
|
[0],[ignore],[ignore])
|
|
for st in '' '-static'
|
|
do
|
|
case $st,$l3 in
|
|
,-rpath*) mst= ;;
|
|
*) mst=-static ;;
|
|
esac
|
|
|
|
LT_AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS $st -o "$rel"main "$rel"main$mst.lo "$rel"sub2/liba.la],
|
|
[0],[ignore],[ignore])
|
|
LT_AT_EXEC_CHECK([./main],[0])
|
|
for l10 in '' '-export-symbols dlselfsyms'
|
|
do
|
|
LT_AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS $st -o "$rel"sub3/dlself "$rel"sub3/dlself$mst.lo "$rel"sub2/liba.la sub/b.lo -dlopen self $l10],
|
|
[0],[ignore],[ignore])
|
|
LT_AT_EXEC_CHECK([./sub3/dlself],[0])
|
|
done
|
|
done
|
|
done
|
|
done
|
|
done
|
|
done
|
|
|
|
AT_CLEANUP
|