aboutsummaryrefslogtreecommitdiff
path: root/test cases
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-07-18 21:20:32 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2023-08-07 05:44:08 -0700
commit926c3a69195385bd5c16acd269f4dae5322e0c03 (patch)
tree38aecac74189f1243b597585dad8ef5200ff0a40 /test cases
parent9df16279971b48787c1db232c274054f173531df (diff)
downloadmeson-926c3a69195385bd5c16acd269f4dae5322e0c03.zip
meson-926c3a69195385bd5c16acd269f4dae5322e0c03.tar.gz
meson-926c3a69195385bd5c16acd269f4dae5322e0c03.tar.bz2
Error when an installed static library links to internal custom target
When an installed static library A links to an internal static library B built using a custom_target(), raise an error instead of a warning. This is because to be usable, A needs to contain B which would require to extract the archive to get its objects files. This used to work, but was printing a warning and was installing a broken static library, because we used to overlink in many cases, and that got fixed in Meson 1.2.0. It now fails at link time with symbols from the custom target not being defined. It's better to turn the warning into a hard error at configure time. While at it, noticed this situation can happen for any internal custom or rust target we link to, recursively. get_internal_static_libraries_recurse() could be called on CustomTarget objects which do not implement it, and even if we did not call that method, it would still fail when trying to call extract_all_objects() on it. Fixes: #12006
Diffstat (limited to 'test cases')
-rw-r--r--test cases/rust/5 polyglot static/meson.build2
-rw-r--r--test cases/unit/113 complex link cases/meson.build51
2 files changed, 52 insertions, 1 deletions
diff --git a/test cases/rust/5 polyglot static/meson.build b/test cases/rust/5 polyglot static/meson.build
index 5d1f023..54f383c 100644
--- a/test cases/rust/5 polyglot static/meson.build
+++ b/test cases/rust/5 polyglot static/meson.build
@@ -7,7 +7,7 @@ r = static_library('stuff', 'stuff.rs', rust_crate_type : 'staticlib')
# as it would do with C libraries, but then cannot extract objects from stuff and
# thus should error out.
# FIXME: We should support this use-case in the future.
-testcase expect_error('Cannot link_whole a custom or Rust target into a static library')
+testcase expect_error('Cannot link_whole a custom or Rust target \'stuff\' into a static library \'clib\'. Instead, pass individual object files with the "objects:" keyword argument if possible. Meson had to promote link to link_whole because \'clib\' is installed but not \'stuff\', and thus has to include objects from \'stuff\' to be usable.')
l = static_library('clib', 'clib.c', link_with : r, install : true)
endtestcase
diff --git a/test cases/unit/113 complex link cases/meson.build b/test cases/unit/113 complex link cases/meson.build
index 04e6281..3b4b898 100644
--- a/test cases/unit/113 complex link cases/meson.build
+++ b/test cases/unit/113 complex link cases/meson.build
@@ -1,5 +1,7 @@
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.
@@ -58,3 +60,52 @@ 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