aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test cases/common/260 declare_dependency objects/bar.c1
-rw-r--r--test cases/common/260 declare_dependency objects/foo.c3
-rw-r--r--test cases/common/260 declare_dependency objects/meson.build23
-rw-r--r--test cases/common/260 declare_dependency objects/prog.c3
4 files changed, 30 insertions, 0 deletions
diff --git a/test cases/common/260 declare_dependency objects/bar.c b/test cases/common/260 declare_dependency objects/bar.c
new file mode 100644
index 0000000..f3ca85c
--- /dev/null
+++ b/test cases/common/260 declare_dependency objects/bar.c
@@ -0,0 +1 @@
+void bar(void) {}
diff --git a/test cases/common/260 declare_dependency objects/foo.c b/test cases/common/260 declare_dependency objects/foo.c
new file mode 100644
index 0000000..9a39cb9
--- /dev/null
+++ b/test cases/common/260 declare_dependency objects/foo.c
@@ -0,0 +1,3 @@
+extern void bar(void);
+
+void foo(void) { bar(); }
diff --git a/test cases/common/260 declare_dependency objects/meson.build b/test cases/common/260 declare_dependency objects/meson.build
new file mode 100644
index 0000000..a9a0c7b
--- /dev/null
+++ b/test cases/common/260 declare_dependency objects/meson.build
@@ -0,0 +1,23 @@
+# Test that declare_dependency(objects: ...) fixes issues with duplicated
+# objects in the final link line, thanks to deduplication of dependencies.
+# The commented declare_dependency() invocation using link_whole instead
+# fails thusly:
+#
+# ar csrDT libbar.a libfoo.a.p/foo.c.o libbar.a.p/bar.c.o
+# ar csrDT libfoo.a libfoo.a.p/foo.c.o
+# cc -o prog prog.p/prog.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,--whole-archive -Wl,--start-group libfoo.a libbar.a -Wl,--end-group -Wl,--no-whole-archive
+# /usr/bin/ld: libfoo.a.p/foo.c.o: in function `foo':
+# ../foo.c:3: multiple definition of `foo'; libfoo.a.p/foo.c.o:../foo.c:3: first defined here
+
+project('Transitive declare_dependency(objects)', 'c')
+
+libfoo = static_library('foo', 'foo.c')
+#foo = declare_dependency(link_whole: libfoo)
+foo = declare_dependency(objects: libfoo.extract_all_objects(recursive: true))
+
+libbar = static_library('bar', 'bar.c', dependencies: foo)
+
+#bar = declare_dependency(link_whole: libbar, dependencies: foo)
+bar = declare_dependency(objects: libbar.extract_all_objects(recursive: true), dependencies: foo)
+
+executable('prog', sources: files('prog.c'), dependencies: [foo, bar])
diff --git a/test cases/common/260 declare_dependency objects/prog.c b/test cases/common/260 declare_dependency objects/prog.c
new file mode 100644
index 0000000..9311679
--- /dev/null
+++ b/test cases/common/260 declare_dependency objects/prog.c
@@ -0,0 +1,3 @@
+extern void foo(void);
+
+int main(void) { foo(); }