diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-09-11 00:22:56 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-09-11 00:23:33 +0300 |
commit | 4e8c4035e53dc2fca255b0e80f5e1390a8b40607 (patch) | |
tree | 924e1b83b3cbc853dcc41e16af84f87db32536ee | |
parent | 32f72fee2553ebc42daac5c9b70386629d47190f (diff) | |
download | meson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.zip meson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.tar.gz meson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.tar.bz2 |
Can have built binaries in run_targets. Closes #264.
-rw-r--r-- | interpreter.py | 9 | ||||
-rw-r--r-- | ninjabackend.py | 29 | ||||
-rw-r--r-- | test cases/common/58 run target/helloprinter.c | 10 | ||||
-rw-r--r-- | test cases/common/58 run target/meson.build | 6 |
4 files changed, 50 insertions, 4 deletions
diff --git a/interpreter.py b/interpreter.py index 9923892..2d86454 100644 --- a/interpreter.py +++ b/interpreter.py @@ -1451,11 +1451,18 @@ class Interpreter(): self.add_target(name, tg.held_object) return tg - @stringArgs @noKwargs def func_run_target(self, node, args, kwargs): if len(args) < 2: raise InterpreterException('Incorrect number of arguments') + for i in args: + try: + i = i.held_object + except AttributeError: + pass + if not isinstance(i, (str, build.BuildTarget)): + mlog.debug('Wrong type:', str(i)) + raise InterpreterException('Invalid argument to run_target.') name = args[0] command = args[1] cmd_args = args[2:] diff --git a/ninjabackend.py b/ninjabackend.py index ebf0a94..3e15a31 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -312,9 +312,32 @@ class NinjaBackend(backends.Backend): def generate_run_target(self, target, outfile): runnerscript = os.path.join(self.environment.get_script_dir(), 'commandrunner.py') - elem = NinjaBuildElement(target.name, 'CUSTOM_COMMAND', []) - cmd = [sys.executable, runnerscript, self.environment.get_source_dir(), self.environment.get_build_dir(), - target.subdir, target.command] + target.args + deps = [] + arg_strings = [] + for i in target.args: + if isinstance(i, str): + arg_strings.append(i) + elif isinstance(i, build.BuildTarget): + deps.append(self.get_target_filename(i)) + else: + raise MesonException('Unreachable code.') + elem = NinjaBuildElement(target.name, 'CUSTOM_COMMAND', deps) + cmd = [sys.executable, runnerscript, self.environment.get_source_dir(), self.environment.get_build_dir(), target.subdir] + texe = target.command + try: + texe = texe.held_object + except AttributeError: + pass + if isinstance(texe, build.Executable): + deps.append(self.get_target_filename(texe)) + if self.environment.is_cross_build() \ + and wrapper is not self.environment.cross_info.config['binaries'].get('exe_wrapper', None): + cmd += [self.environment.cross_info.config['binaries']['exe_wrapper'], self.get_target_filename(texe)] + else: + cmd += [os.path.join(self.environment.get_build_dir(), self.get_target_filename(texe))] + else: + cmd.append(target.command) + cmd += target.args elem.add_item('COMMAND', cmd) elem.add_item('description', 'Running external command %s.' % target.name) elem.add_item('pool', 'console') diff --git a/test cases/common/58 run target/helloprinter.c b/test cases/common/58 run target/helloprinter.c new file mode 100644 index 0000000..7f94b19 --- /dev/null +++ b/test cases/common/58 run target/helloprinter.c @@ -0,0 +1,10 @@ +#include<stdio.h> + +int main(int argc, char **argv) { + if(argc != 2) { + printf("I can not haz argument.\n"); + } else { + printf("I can haz argument: %s\n", argv[1]); + } + return 0; +} diff --git a/test cases/common/58 run target/meson.build b/test cases/common/58 run target/meson.build index 3ae80d2..519adf5 100644 --- a/test cases/common/58 run target/meson.build +++ b/test cases/common/58 run target/meson.build @@ -1,3 +1,9 @@ project('run target', 'c') run_target('mycommand', 'scripts/script.sh') + +# Make it possible to run built programs. +# In cross builds exe_wrapper should be added if it exists. + +exe = executable('helloprinter', 'helloprinter.c') +run_target('runhello', exe, 'argument') |