aboutsummaryrefslogtreecommitdiffstats
path: root/meson/test cases/common/170 generator link whole
diff options
context:
space:
mode:
Diffstat (limited to 'meson/test cases/common/170 generator link whole')
-rw-r--r--meson/test cases/common/170 generator link whole/export.h18
-rwxr-xr-xmeson/test cases/common/170 generator link whole/generator.py30
-rw-r--r--meson/test cases/common/170 generator link whole/main.c11
-rw-r--r--meson/test cases/common/170 generator link whole/meson.build62
-rw-r--r--meson/test cases/common/170 generator link whole/meson_test_function.tmpl0
-rw-r--r--meson/test cases/common/170 generator link whole/pull_meson_test_function.c6
6 files changed, 127 insertions, 0 deletions
diff --git a/meson/test cases/common/170 generator link whole/export.h b/meson/test cases/common/170 generator link whole/export.h
new file mode 100644
index 000000000..f4f6f451b
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/export.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#if defined BUILDING_EMBEDDED
+ #define DLL_PUBLIC
+#elif 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
diff --git a/meson/test cases/common/170 generator link whole/generator.py b/meson/test cases/common/170 generator link whole/generator.py
new file mode 100755
index 000000000..18a6cc2f5
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/generator.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+import os
+import os.path
+import sys
+
+
+def main():
+ name = os.path.splitext(os.path.basename(sys.argv[1]))[0]
+ out = sys.argv[2]
+ hname = os.path.join(out, name + '.h')
+ cname = os.path.join(out, name + '.c')
+ print(os.getcwd(), hname)
+ with open(hname, 'w') as hfile:
+ hfile.write('''
+#pragma once
+#include "export.h"
+int DLL_PUBLIC {name}(void);
+'''.format(name=name))
+ with open(cname, 'w') as cfile:
+ cfile.write('''
+#include "{name}.h"
+int {name}(void) {{
+ return {size};
+}}
+'''.format(name=name, size=len(name)))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/meson/test cases/common/170 generator link whole/main.c b/meson/test cases/common/170 generator link whole/main.c
new file mode 100644
index 000000000..7605022d8
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/main.c
@@ -0,0 +1,11 @@
+#include "meson_test_function.h"
+
+#include <stdio.h>
+
+int main(void) {
+ if (meson_test_function() != 19) {
+ printf("Bad meson_test_function()\n");
+ return 1;
+ }
+ return 0;
+}
diff --git a/meson/test cases/common/170 generator link whole/meson.build b/meson/test cases/common/170 generator link whole/meson.build
new file mode 100644
index 000000000..f5d3e5884
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/meson.build
@@ -0,0 +1,62 @@
+project('generator link_whole', 'c')
+
+if meson.backend() == 'xcode'
+ error('MESON_SKIP_TEST: whole-archive not supported in Xcode. Patches welcome.')
+endif
+
+# This just generates foo.h and foo.c with int foo() defined.
+gen_py = find_program('generator.py')
+gen = generator(gen_py,
+ output: ['@BASENAME@.h', '@BASENAME@.c'],
+ arguments : ['@INPUT@', '@BUILD_DIR@'])
+
+# Test 1: link directly into executable
+srcs = gen.process('meson_test_function.tmpl')
+exe = executable('exe1', [srcs, 'main.c'], c_args : '-DBUILDING_EMBEDDED')
+test('test1', exe)
+
+# Test 2: link into shared library and access from executable
+srcs = gen.process('meson_test_function.tmpl')
+shlib2 = shared_library('shlib2', [srcs], c_args : '-DBUILDING_DLL')
+exe = executable('exe2', 'main.c',
+ link_with : shlib2,
+ include_directories : shlib2.private_dir_include(),
+)
+test('test2', exe)
+
+# Test 3: link into static library and access from executable
+srcs = gen.process('meson_test_function.tmpl')
+stlib3 = static_library('stlib3', [srcs], c_args : '-DBUILDING_EMBEDDED')
+exe = executable('exe3', 'main.c',
+ c_args : '-DBUILDING_EMBEDDED',
+ link_with : stlib3,
+ include_directories : stlib3.private_dir_include(),
+)
+test('test3', exe)
+
+# Test 4: link into static library, link into shared
+# and access from executable. To make sure static_library
+# is not dropped use pull_meson_test_function helper.
+srcs = gen.process('meson_test_function.tmpl')
+stlib4 = static_library('stlib4', [srcs], c_args : '-DBUILDING_DLL')
+shlib4 = shared_library('shlib4', 'pull_meson_test_function.c',
+ c_args : '-DBUILDING_DLL',
+ link_with : stlib4,
+ include_directories : stlib4.private_dir_include(),
+)
+exe = executable('exe4', 'main.c',
+ link_with : shlib4,
+ include_directories : stlib4.private_dir_include(),
+)
+test('test4', exe)
+
+# Test 5: link into static library, link_whole into shared
+# and access from executable
+srcs = gen.process('meson_test_function.tmpl')
+stlib5 = static_library('stlib5', [srcs], c_args : '-DBUILDING_DLL')
+shlib5 = shared_library('shlib5', link_whole : stlib5)
+exe = executable('exe5', 'main.c',
+ link_with : shlib5,
+ include_directories : stlib5.private_dir_include(),
+)
+test('test5', exe)
diff --git a/meson/test cases/common/170 generator link whole/meson_test_function.tmpl b/meson/test cases/common/170 generator link whole/meson_test_function.tmpl
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/meson_test_function.tmpl
diff --git a/meson/test cases/common/170 generator link whole/pull_meson_test_function.c b/meson/test cases/common/170 generator link whole/pull_meson_test_function.c
new file mode 100644
index 000000000..23d24acf4
--- /dev/null
+++ b/meson/test cases/common/170 generator link whole/pull_meson_test_function.c
@@ -0,0 +1,6 @@
+#include "export.h"
+#include "meson_test_function.h"
+
+int DLL_PUBLIC function_puller(void) {
+ return meson_test_function();
+}