summaryrefslogtreecommitdiffstats
path: root/test cases/common/137 whole archive
diff options
context:
space:
mode:
Diffstat (limited to 'test cases/common/137 whole archive')
-rw-r--r--test cases/common/137 whole archive/exe/meson.build1
-rw-r--r--test cases/common/137 whole archive/exe2/meson.build1
-rw-r--r--test cases/common/137 whole archive/exe3/meson.build1
-rw-r--r--test cases/common/137 whole archive/exe4/meson.build1
-rw-r--r--test cases/common/137 whole archive/func1.c7
-rw-r--r--test cases/common/137 whole archive/func2.c7
-rw-r--r--test cases/common/137 whole archive/meson.build49
-rw-r--r--test cases/common/137 whole archive/mylib.h21
-rw-r--r--test cases/common/137 whole archive/prog.c5
-rw-r--r--test cases/common/137 whole archive/sh_func2_dep_func1/meson.build4
-rw-r--r--test cases/common/137 whole archive/sh_func2_linked_func1/meson.build3
-rw-r--r--test cases/common/137 whole archive/sh_func2_transdep_func1/meson.build6
-rw-r--r--test cases/common/137 whole archive/sh_only_link_whole/meson.build1
-rw-r--r--test cases/common/137 whole archive/st_func1/meson.build1
-rw-r--r--test cases/common/137 whole archive/st_func2/meson.build1
15 files changed, 109 insertions, 0 deletions
diff --git a/test cases/common/137 whole archive/exe/meson.build b/test cases/common/137 whole archive/exe/meson.build
new file mode 100644
index 0000000..91d298d
--- /dev/null
+++ b/test cases/common/137 whole archive/exe/meson.build
@@ -0,0 +1 @@
+exe = executable('prog', '../prog.c', link_with : sh_func2_linked_func1)
diff --git a/test cases/common/137 whole archive/exe2/meson.build b/test cases/common/137 whole archive/exe2/meson.build
new file mode 100644
index 0000000..9184864
--- /dev/null
+++ b/test cases/common/137 whole archive/exe2/meson.build
@@ -0,0 +1 @@
+exe2 = executable('prog2', '../prog.c', link_with : sh_only_link_whole)
diff --git a/test cases/common/137 whole archive/exe3/meson.build b/test cases/common/137 whole archive/exe3/meson.build
new file mode 100644
index 0000000..82cf57e
--- /dev/null
+++ b/test cases/common/137 whole archive/exe3/meson.build
@@ -0,0 +1 @@
+exe3 = executable('prog3', '../prog.c', link_with : sh_func2_dep_func1)
diff --git a/test cases/common/137 whole archive/exe4/meson.build b/test cases/common/137 whole archive/exe4/meson.build
new file mode 100644
index 0000000..0781250
--- /dev/null
+++ b/test cases/common/137 whole archive/exe4/meson.build
@@ -0,0 +1 @@
+exe4 = executable('prog4', '../prog.c', link_with : sh_func2_transdep_func1)
diff --git a/test cases/common/137 whole archive/func1.c b/test cases/common/137 whole archive/func1.c
new file mode 100644
index 0000000..161c5da
--- /dev/null
+++ b/test cases/common/137 whole archive/func1.c
@@ -0,0 +1,7 @@
+#define BUILDING_DLL
+
+#include<mylib.h>
+
+int func1(void) {
+ return 42;
+}
diff --git a/test cases/common/137 whole archive/func2.c b/test cases/common/137 whole archive/func2.c
new file mode 100644
index 0000000..4fe7150
--- /dev/null
+++ b/test cases/common/137 whole archive/func2.c
@@ -0,0 +1,7 @@
+#define BUILDING_DLL
+
+#include<mylib.h>
+
+int func2(void) {
+ return 42;
+}
diff --git a/test cases/common/137 whole archive/meson.build b/test cases/common/137 whole archive/meson.build
new file mode 100644
index 0000000..d4cbb83
--- /dev/null
+++ b/test cases/common/137 whole archive/meson.build
@@ -0,0 +1,49 @@
+project('whole archive', 'c')
+
+if meson.backend() == 'xcode' or \
+ meson.backend() == 'vs2010' or \
+ meson.backend() == 'vs2012' or \
+ meson.backend() == 'vs2013'
+ error('MESON_SKIP_TEST: whole-archive not supported in Xcode nor pre-VS2015 IDE. Patches welcome.')
+endif
+
+add_project_arguments('-I' + meson.source_root(), language : 'c')
+
+# Test 1: link_whole keeps all symbols
+# Make static func1
+subdir('st_func1')
+# Make shared func2 linking whole func1 archive
+subdir('sh_func2_linked_func1')
+# Link exe with shared library only
+subdir('exe')
+# Test that both func1 and func2 are accessible from shared library
+test('prog', exe)
+
+# Test 2: link_whole can be used instead of source list, see #2180
+# Make static func2
+subdir('st_func2')
+# Link both func1 and func2 into same shared library
+# which does not have any sources other than 2 static libraries
+subdir('sh_only_link_whole')
+# Link exe2 with shared library only
+subdir('exe2')
+# Test that both func1 and func2 are accessible from shared library
+test('prog2', exe2)
+
+# Test 3: link_whole can be used in declare_dependency()
+func1_dep = declare_dependency(link_whole : [st_func1])
+# Use dependency to link func1 into shared library
+subdir('sh_func2_dep_func1')
+# Link exe3 with shared library
+subdir('exe3')
+# Test that both func1 and func2 are accessible from shared library
+test('prog3', exe3)
+
+# Test 4: link_whole can be used in transitive declare_dependency()
+func1_trans_dep = declare_dependency(dependencies : func1_dep)
+# Use transitive dependency to link func1 into shared library
+subdir('sh_func2_transdep_func1')
+# Link exe4 with shared library
+subdir('exe4')
+# Test that both func1 and func2 are accessible from shared library
+test('prog4', exe4)
diff --git a/test cases/common/137 whole archive/mylib.h b/test cases/common/137 whole archive/mylib.h
new file mode 100644
index 0000000..79ce585
--- /dev/null
+++ b/test cases/common/137 whole archive/mylib.h
@@ -0,0 +1,21 @@
+#pragma once
+
+/* Both funcs here for simplicity. */
+
+#if defined _WIN32 || defined __CYGWIN__
+#if defined BUILDING_DLL
+ #define DLL_PUBLIC __declspec(dllexport)
+#else
+ #define DLL_PUBLIC __declspec(dllimport)
+#endif
+#else
+ #if defined __GNUC__
+ #define DLL_PUBLIC __attribute__ ((visibility("default")))
+ #else
+ #pragma message ("Compiler does not support symbol visibility.")
+ #define DLL_PUBLIC
+ #endif
+#endif
+
+int DLL_PUBLIC func1(void);
+int DLL_PUBLIC func2(void);
diff --git a/test cases/common/137 whole archive/prog.c b/test cases/common/137 whole archive/prog.c
new file mode 100644
index 0000000..1f553e5
--- /dev/null
+++ b/test cases/common/137 whole archive/prog.c
@@ -0,0 +1,5 @@
+#include<mylib.h>
+
+int main(void) {
+ return func1() - func2();
+}
diff --git a/test cases/common/137 whole archive/sh_func2_dep_func1/meson.build b/test cases/common/137 whole archive/sh_func2_dep_func1/meson.build
new file mode 100644
index 0000000..92baca6
--- /dev/null
+++ b/test cases/common/137 whole archive/sh_func2_dep_func1/meson.build
@@ -0,0 +1,4 @@
+# Same as sh_func2_linked_func1, # func2.c does not depend on func1(),
+# so without link_whole compiler would throw func1() away.
+# This is the same version of the test with a dependency object instead.
+sh_func2_dep_func1 = shared_library('sh_func2_dep_func1', '../func2.c', dependencies : func1_dep)
diff --git a/test cases/common/137 whole archive/sh_func2_linked_func1/meson.build b/test cases/common/137 whole archive/sh_func2_linked_func1/meson.build
new file mode 100644
index 0000000..2858f65
--- /dev/null
+++ b/test cases/common/137 whole archive/sh_func2_linked_func1/meson.build
@@ -0,0 +1,3 @@
+# Nothing in func2.c uses func1, so the linker would throw it
+# away and thus linking the exe would fail.
+sh_func2_linked_func1 = shared_library('sh_func2_linked_func1', '../func2.c', link_whole : st_func1)
diff --git a/test cases/common/137 whole archive/sh_func2_transdep_func1/meson.build b/test cases/common/137 whole archive/sh_func2_transdep_func1/meson.build
new file mode 100644
index 0000000..0703077
--- /dev/null
+++ b/test cases/common/137 whole archive/sh_func2_transdep_func1/meson.build
@@ -0,0 +1,6 @@
+# Same as sh_func2_dep_func1 but dependency is transitive.
+# func2.c does not have any reference to func1() so without link_whole compiler
+# should throw func1() out.
+sh_func2_transdep_func1 = shared_library(
+ 'sh_func2_transdep_func1', '../func2.c',
+ dependencies : func1_trans_dep)
diff --git a/test cases/common/137 whole archive/sh_only_link_whole/meson.build b/test cases/common/137 whole archive/sh_only_link_whole/meson.build
new file mode 100644
index 0000000..64baabd
--- /dev/null
+++ b/test cases/common/137 whole archive/sh_only_link_whole/meson.build
@@ -0,0 +1 @@
+sh_only_link_whole = shared_library('sh_only_link_whole', link_whole : [st_func1, st_func2])
diff --git a/test cases/common/137 whole archive/st_func1/meson.build b/test cases/common/137 whole archive/st_func1/meson.build
new file mode 100644
index 0000000..c84d781
--- /dev/null
+++ b/test cases/common/137 whole archive/st_func1/meson.build
@@ -0,0 +1 @@
+st_func1 = static_library('st_func1', '../func1.c')
diff --git a/test cases/common/137 whole archive/st_func2/meson.build b/test cases/common/137 whole archive/st_func2/meson.build
new file mode 100644
index 0000000..2732f96
--- /dev/null
+++ b/test cases/common/137 whole archive/st_func2/meson.build
@@ -0,0 +1 @@
+st_func2 = static_library('st_func2', '../func2.c')