aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Avila de Espindola <rafael@espindo.la>2018-07-16 23:35:10 -0700
committerNirbheek Chauhan <nirbheek@centricular.com>2018-08-24 03:14:07 +0530
commit3a8fb34bf577ed66c43ab364cda04dd6c1ffd404 (patch)
tree32b0847d0d5dfce5d3dee147b04de36337182d55
parentb24db2950db1aff7d45b4b81088fc54eaa258e91 (diff)
downloadmeson-3a8fb34bf577ed66c43ab364cda04dd6c1ffd404.zip
meson-3a8fb34bf577ed66c43ab364cda04dd6c1ffd404.tar.gz
meson-3a8fb34bf577ed66c43ab364cda04dd6c1ffd404.tar.bz2
Handle transitive links to 'threads' dependencies.
Meson already had code to propagate link dependencies from static libraries to programs that use those static libraries. Unfortunately, it was not handling the special cases of 'threads' and 'openmp' dependencies.
-rw-r--r--mesonbuild/backend/ninjabackend.py21
-rw-r--r--test cases/common/205 static threads/lib1.c5
-rw-r--r--test cases/common/205 static threads/lib2.c5
-rw-r--r--test cases/common/205 static threads/meson.build13
-rw-r--r--test cases/common/205 static threads/prog.c6
5 files changed, 43 insertions, 7 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index c3c2581..d602bc1 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -2610,25 +2610,32 @@ rule FORTRAN_DEP_HACK%s
dependencies = target.get_dependencies()
internal = self.build_target_link_arguments(linker, dependencies)
commands += internal
- # For 'automagic' deps: Boost and GTest. Also dependency('threads').
- # pkg-config puts the thread flags itself via `Cflags:`
- for d in target.external_deps:
- if d.need_threads():
- commands += linker.thread_link_flags(self.environment)
- elif d.need_openmp():
- commands += linker.openmp_flags()
# Only non-static built targets need link args and link dependencies
if not isinstance(target, build.StaticLibrary):
+ # For 'automagic' deps: Boost and GTest. Also dependency('threads').
+ # pkg-config puts the thread flags itself via `Cflags:`
+ need_threads = False
+ need_openmp = False
+
commands += target.link_args
# External deps must be last because target link libraries may depend on them.
for dep in target.get_external_deps():
# Extend without reordering or de-dup to preserve `-L -l` sets
# https://github.com/mesonbuild/meson/issues/1718
commands.extend_direct(dep.get_link_args())
+ need_threads |= dep.need_threads()
+ need_openmp |= dep.need_openmp()
for d in target.get_dependencies():
if isinstance(d, build.StaticLibrary):
for dep in d.get_external_deps():
+ need_threads |= dep.need_threads()
+ need_openmp |= dep.need_openmp()
commands.extend_direct(dep.get_link_args())
+ if need_openmp:
+ commands += linker.openmp_flags()
+ if need_threads:
+ commands += linker.thread_link_flags(self.environment)
+
# Add link args for c_* or cpp_* build options. Currently this only
# adds c_winlibs and cpp_winlibs when building for Windows. This needs
# to be after all internal and external libraries so that unresolved
diff --git a/test cases/common/205 static threads/lib1.c b/test cases/common/205 static threads/lib1.c
new file mode 100644
index 0000000..de24416
--- /dev/null
+++ b/test cases/common/205 static threads/lib1.c
@@ -0,0 +1,5 @@
+#include<pthread.h>
+
+void *f(void) {
+ return pthread_create;
+}
diff --git a/test cases/common/205 static threads/lib2.c b/test cases/common/205 static threads/lib2.c
new file mode 100644
index 0000000..e988814
--- /dev/null
+++ b/test cases/common/205 static threads/lib2.c
@@ -0,0 +1,5 @@
+extern void *f(void);
+
+void *g(void) {
+ return f();
+}
diff --git a/test cases/common/205 static threads/meson.build b/test cases/common/205 static threads/meson.build
new file mode 100644
index 0000000..4279200
--- /dev/null
+++ b/test cases/common/205 static threads/meson.build
@@ -0,0 +1,13 @@
+project('threads', 'c')
+
+thread_dep = dependency('threads')
+
+
+lib1 = static_library('lib1', 'lib1.c',
+ dependencies : thread_dep)
+
+lib2 = static_library('lib2', 'lib2.c',
+ link_with : lib1)
+
+executable('prog', 'prog.c',
+ link_with : lib2)
diff --git a/test cases/common/205 static threads/prog.c b/test cases/common/205 static threads/prog.c
new file mode 100644
index 0000000..14a7c76
--- /dev/null
+++ b/test cases/common/205 static threads/prog.c
@@ -0,0 +1,6 @@
+extern void *g(void);
+
+int main(void) {
+ g();
+ return 0;
+}