Handle transitive links to 'threads' dependencies. (#3895)

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.
pull/3910/head
Rafael Ávila de Espíndola 7 years ago committed by Jussi Pakkanen
parent f390a0a2f3
commit aee9f58939
  1. 21
      mesonbuild/backend/ninjabackend.py
  2. 13
      test cases/common/205 static threads/lib1.c
  3. 5
      test cases/common/205 static threads/lib2.c
  4. 13
      test cases/common/205 static threads/meson.build
  5. 6
      test cases/common/205 static threads/prog.c

@ -2623,25 +2623,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

@ -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
}

@ -0,0 +1,5 @@
extern void *f(void);
void *g(void) {
return f();
}

@ -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)

@ -0,0 +1,6 @@
extern void *g(void);
int main(void) {
g();
return 0;
}
Loading…
Cancel
Save