Skip to content

Commit

Permalink
Handle transitive links to 'threads' dependencies. (#3895)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
espindola authored and jpakkane committed Jul 18, 2018
1 parent f390a0a commit aee9f58
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 7 deletions.
21 changes: 14 additions & 7 deletions mesonbuild/backend/ninjabackend.py
Original file line number Diff line number Diff line change
Expand Up @@ -2623,25 +2623,32 @@ def generate_link(self, target, outfile, outname, obj_list, linker, extra_args=[
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
Expand Down
13 changes: 13 additions & 0 deletions test cases/common/205 static threads/lib1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#if defined _WIN32
#include<windows.h>
#else
#include<pthread.h>
#endif

void *f(void) {
#if defined _WIN32
return CreateThread;
#else
return pthread_create;
#endif
}
5 changes: 5 additions & 0 deletions test cases/common/205 static threads/lib2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
extern void *f(void);

void *g(void) {
return f();
}
13 changes: 13 additions & 0 deletions test cases/common/205 static threads/meson.build
Original file line number Diff line number Diff line change
@@ -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)
6 changes: 6 additions & 0 deletions test cases/common/205 static threads/prog.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
extern void *g(void);

int main(void) {
g();
return 0;
}

0 comments on commit aee9f58

Please sign in to comment.