aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-09-11 00:22:56 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2015-09-11 00:23:33 +0300
commit4e8c4035e53dc2fca255b0e80f5e1390a8b40607 (patch)
tree924e1b83b3cbc853dcc41e16af84f87db32536ee
parent32f72fee2553ebc42daac5c9b70386629d47190f (diff)
downloadmeson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.zip
meson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.tar.gz
meson-4e8c4035e53dc2fca255b0e80f5e1390a8b40607.tar.bz2
Can have built binaries in run_targets. Closes #264.
-rw-r--r--interpreter.py9
-rw-r--r--ninjabackend.py29
-rw-r--r--test cases/common/58 run target/helloprinter.c10
-rw-r--r--test cases/common/58 run target/meson.build6
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')