diff options
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 21 | ||||
-rw-r--r-- | test cases/common/205 static threads/lib1.c | 13 | ||||
-rw-r--r-- | test cases/common/205 static threads/lib2.c | 5 | ||||
-rw-r--r-- | test cases/common/205 static threads/meson.build | 13 | ||||
-rw-r--r-- | test cases/common/205 static threads/prog.c | 6 |
5 files changed, 51 insertions, 7 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 09c4904..035f835 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -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 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..1aa786c --- /dev/null +++ b/test cases/common/205 static threads/lib1.c @@ -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 +} 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; +} |