summaryrefslogtreecommitdiff
path: root/test cases/unit/114 complex link cases
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2023-10-26 19:23:20 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2023-10-27 17:43:03 +0300
commit3bbe66e971dfe84dcffa702c2673fb136da0a508 (patch)
treedfad22ea1a365b4584320a92f1aa592ef868e14d /test cases/unit/114 complex link cases
parentada6236f76f4fbce4313b48eeaf9d8485516fde8 (diff)
downloadmeson-3bbe66e971dfe84dcffa702c2673fb136da0a508.tar.gz
Condense test directories for RC1.
Diffstat (limited to 'test cases/unit/114 complex link cases')
-rw-r--r--test cases/unit/114 complex link cases/main.c6
-rw-r--r--test cases/unit/114 complex link cases/meson.build111
-rw-r--r--test cases/unit/114 complex link cases/s1.c3
-rw-r--r--test cases/unit/114 complex link cases/s2.c5
-rw-r--r--test cases/unit/114 complex link cases/s3.c5
5 files changed, 130 insertions, 0 deletions
diff --git a/test cases/unit/114 complex link cases/main.c b/test cases/unit/114 complex link cases/main.c
new file mode 100644
index 000000000..739b413af
--- /dev/null
+++ b/test cases/unit/114 complex link cases/main.c
@@ -0,0 +1,6 @@
+int s3(void);
+
+int main(int argc, char *argv[])
+{
+ return s3();
+}
diff --git a/test cases/unit/114 complex link cases/meson.build b/test cases/unit/114 complex link cases/meson.build
new file mode 100644
index 000000000..3b4b898df
--- /dev/null
+++ b/test cases/unit/114 complex link cases/meson.build
@@ -0,0 +1,111 @@
+project('complex link cases', 'c')
+
+cc = meson.get_compiler('c')
+
+# In all tests, e1 uses s3 which uses s2 which uses s1.
+
+# Executable links with s3 and s1 but not s2 because it is included in s3.
+s1 = static_library('t1-s1', 's1.c')
+s2 = static_library('t1-s2', 's2.c', link_with: s1)
+s3 = static_library('t1-s3', 's3.c', link_whole: s2)
+e = executable('t1-e1', 'main.c', link_with: s3)
+
+# s3 is installed but not s1 so it has to include s1 too.
+# Executable links only s3 because it contains s1 and s2.
+s1 = static_library('t2-s1', 's1.c')
+s2 = static_library('t2-s2', 's2.c', link_with: s1)
+s3 = static_library('t2-s3', 's3.c', link_whole: s2, install: true)
+e = executable('t2-e1', 'main.c', link_with: s3)
+
+# Executable needs to link with s3 only
+s1 = static_library('t3-s1', 's1.c')
+s2 = static_library('t3-s2', 's2.c', link_with: s1)
+s3 = shared_library('t3-s3', 's3.c', link_with: s2)
+e = executable('t3-e1', 'main.c', link_with: s3)
+
+# Executable needs to link with s3 and s2
+s1 = static_library('t4-s1', 's1.c')
+s2 = shared_library('t4-s2', 's2.c', link_with: s1)
+s3 = static_library('t4-s3', 's3.c', link_with: s2)
+e = executable('t4-e1', 'main.c', link_with: s3)
+
+# Executable needs to link with s3 and s1
+s1 = shared_library('t5-s1', 's1.c')
+s2 = static_library('t5-s2', 's2.c', link_with: s1)
+s3 = static_library('t5-s3', 's3.c', link_with: s2, install: true)
+e = executable('t5-e1', 'main.c', link_with: s3)
+
+# Executable needs to link with s3 and s2
+s1 = static_library('t6-s1', 's1.c')
+s2 = static_library('t6-s2', 's2.c', link_with: s1, install: true)
+s3 = static_library('t6-s3', 's3.c', link_with: s2, install: true)
+e = executable('t6-e1', 'main.c', link_with: s3)
+
+# Regression test: s1 gets promoted to link_whole and that used to make all other
+# libraries in the list (s2) to be ignored.
+# Executable only needs to link with s3.
+# See https://github.com/mesonbuild/meson/issues/11956.
+s1 = static_library('t7-s1', 's1.c')
+s2 = static_library('t7-s2', 's2.c')
+s3 = static_library('t7-s3', 's3.c', link_with: [s1, s2], install: true)
+e = executable('t7-e1', 'main.c', link_with: s3)
+
+# Regression test: s3 should come last in the linker command. This seems to be
+# required for at least backward compatibility reasons:
+# https://github.com/mesonbuild/meson/pull/11957#issuecomment-1629243208
+s1 = static_library('t8-s1', 's1.c')
+s2 = static_library('t8-s2', 's2.c')
+s3 = static_library('t8-s3', 's3.c')
+e = executable('t8-e1', 'main.c',
+ link_with: [s1, s2],
+ dependencies: declare_dependency(link_with: s3),
+)
+
+if cc.get_argument_syntax() == 'gcc'
+ # s1 is an internal static library, using custom target.
+ s1_o = custom_target(
+ input: 's1.c',
+ output: 's1.c.o',
+ command: [cc.cmd_array(), '-c', '-o', '@OUTPUT@', '@INPUT@']
+ )
+ s1 = custom_target(
+ output: 'libt9-s1.a',
+ command: ['ar', 'rcs', '@OUTPUT@', s1_o],
+ )
+
+ # Executable needs to link with s1, s2 and s3.
+ s2 = static_library('t9-s2', 's2.c', link_with: s1)
+ s3 = static_library('t9-s3', 's3.c', link_with: s2)
+ e = executable('t9-e1', 'main.c', link_with: s3)
+
+ # s2 cannot be installed because s1 is not being installed and Meson cannot
+ # extract object files from the custom target.
+ testcase expect_error('Cannot link_whole a custom or Rust target \'libt9-s1.a\' into a static library \'t10-s2\'. Instead, pass individual object files with the "objects:" keyword argument if possible. Meson had to promote link to link_whole because \'t10-s2\' is installed but not \'libt9-s1.a\', and thus has to include objects from \'libt9-s1.a\' to be usable.')
+ s2 = static_library('t10-s2', 's2.c', link_with: s1, install: true)
+ endtestcase
+
+ # s3 cannot be installed because s1 is not being installed and Meson cannot
+ # extract object files from the custom target.
+ testcase expect_error('Cannot link_whole a custom or Rust target \'libt9-s1.a\' into a static library \'t11-s3\'. Instead, pass individual object files with the "objects:" keyword argument if possible. Meson had to promote link to link_whole because \'t11-s3\' is installed but not \'libt9-s1.a\', and thus has to include objects from \'libt9-s1.a\' to be usable.')
+ s2 = static_library('t11-s2', 's2.c', link_with: s1)
+ s3 = static_library('t11-s3', 's3.c', link_with: s2, install: true)
+ endtestcase
+
+ # s1 is an installed static library, using custom target.
+ s1 = custom_target(
+ output: 'libt12-s1.a',
+ command: ['ar', 'rcs', '@OUTPUT@', s1_o],
+ install: true,
+ install_dir: get_option('libdir'),
+ )
+
+ # Executable needs to link with s1, s2 and s3.
+ s2 = static_library('t12-s2', 's2.c', link_with: s1, install: true)
+ s3 = static_library('t12-s3', 's3.c', link_with: s2)
+ e = executable('t12-e1', 'main.c', link_with: s3)
+
+ # Executable links with s3 and s1 but not s2 because it is included in s3.
+ s2 = static_library('t13-s2', 's2.c', link_with: s1)
+ s3 = static_library('t13-s3', 's3.c', link_with: s2, install: true)
+ e = executable('t13-e1', 'main.c', link_with: s3)
+endif
diff --git a/test cases/unit/114 complex link cases/s1.c b/test cases/unit/114 complex link cases/s1.c
new file mode 100644
index 000000000..68bba4949
--- /dev/null
+++ b/test cases/unit/114 complex link cases/s1.c
@@ -0,0 +1,3 @@
+int s1(void) {
+ return 1;
+}
diff --git a/test cases/unit/114 complex link cases/s2.c b/test cases/unit/114 complex link cases/s2.c
new file mode 100644
index 000000000..835870c04
--- /dev/null
+++ b/test cases/unit/114 complex link cases/s2.c
@@ -0,0 +1,5 @@
+int s1(void);
+
+int s2(void) {
+ return s1() + 1;
+}
diff --git a/test cases/unit/114 complex link cases/s3.c b/test cases/unit/114 complex link cases/s3.c
new file mode 100644
index 000000000..08e062010
--- /dev/null
+++ b/test cases/unit/114 complex link cases/s3.c
@@ -0,0 +1,5 @@
+int s2(void);
+
+int s3(void) {
+ return s2() + 1;
+}