From 44a340a4fe16db80fc4fd16311b27843916a5f7f Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Thu, 13 Sep 2018 16:57:34 +0100 Subject: [PATCH 1/2] Move default is_linkable_target method up from BuildTarget to Target BuildTarget.link() assumes that it can call is_linkable_target() on any objects which are a subclass of Target --- mesonbuild/build.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index b86c84d96..5538dfc4f 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -363,6 +363,8 @@ a hard error in the future.''' % name) result[k] = v return result + def is_linkable_target(self): + return False class BuildTarget(Target): known_kwargs = known_build_target_kwargs @@ -1104,9 +1106,6 @@ You probably should put it in link_with instead.''') return True return False - def is_linkable_target(self): - return False - def check_module_linking(self): ''' Warn if shared modules are linked with target: (link_with) #2865 From 623a8010e63fd55b596cc19ac6a9bc6e93f53cef Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Thu, 13 Sep 2018 16:45:35 +0100 Subject: [PATCH 2/2] Add test case for trying to link with a library made by a custom_target --- .../failing/89 link_with custom target/demo.c | 5 ++++ .../failing/89 link_with custom target/foo.c | 3 +++ .../lib_generator.py | 24 +++++++++++++++++++ .../89 link_with custom target/meson.build | 23 ++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 test cases/failing/89 link_with custom target/demo.c create mode 100644 test cases/failing/89 link_with custom target/foo.c create mode 100755 test cases/failing/89 link_with custom target/lib_generator.py create mode 100644 test cases/failing/89 link_with custom target/meson.build diff --git a/test cases/failing/89 link_with custom target/demo.c b/test cases/failing/89 link_with custom target/demo.c new file mode 100644 index 000000000..b6feacaef --- /dev/null +++ b/test cases/failing/89 link_with custom target/demo.c @@ -0,0 +1,5 @@ +int func_in_foo(); + +int main(int argc, char **argv) { + return func_in_foo(); +} diff --git a/test cases/failing/89 link_with custom target/foo.c b/test cases/failing/89 link_with custom target/foo.c new file mode 100644 index 000000000..2c714223d --- /dev/null +++ b/test cases/failing/89 link_with custom target/foo.c @@ -0,0 +1,3 @@ +int func_in_foo() { + return 0; +} diff --git a/test cases/failing/89 link_with custom target/lib_generator.py b/test cases/failing/89 link_with custom target/lib_generator.py new file mode 100755 index 000000000..98ed5a820 --- /dev/null +++ b/test cases/failing/89 link_with custom target/lib_generator.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# Mimic a binary that generates a static library + +import os +import subprocess +import sys + +if __name__ == '__main__': + if len(sys.argv) != 4: + print(sys.argv[0], 'compiler input_file output_file') + sys.exit(1) + compiler = sys.argv[1] + ifile = sys.argv[2] + ofile = sys.argv[3] + tmp = ifile + '.o' + if compiler.endswith('cl'): + subprocess.check_call([compiler, '/nologo', '/MDd', '/Fo' + tmp, '/c', ifile]) + subprocess.check_call(['lib', '/nologo', '/OUT:' + ofile, tmp]) + else: + subprocess.check_call([compiler, '-c', ifile, '-o', tmp]) + subprocess.check_call(['ar', 'csr', ofile, tmp]) + +os.unlink(tmp) diff --git a/test cases/failing/89 link_with custom target/meson.build b/test cases/failing/89 link_with custom target/meson.build new file mode 100644 index 000000000..6977ca1b7 --- /dev/null +++ b/test cases/failing/89 link_with custom target/meson.build @@ -0,0 +1,23 @@ +project('link_with custom target', ['c']) + +# +# libraries created by a custom_target currently can be used in sources: (see +# common/100 manygen/ for an example of that), but not in link_with: +# + +lib_generator = find_program('lib_generator.py') + +cc = meson.get_compiler('c').cmd_array().get(-1) + +libfoo_target = custom_target( + 'libfoo', + input: ['foo.c'], + output: ['libfoo.a'], + command: [lib_generator, cc, '@INPUT@', '@OUTPUT@'] +) + +libfoo = declare_dependency( + link_with: libfoo_target, +) + +executable('demo', ['demo.c'], dependencies: [libfoo])