aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-07-01 22:45:49 +0300
committerGitHub <noreply@github.com>2016-07-01 22:45:49 +0300
commitcc775d64c9ca73e9a02710a84ac9f0a5fc01c593 (patch)
tree39ed3bdaadf44cb7fb9cd444fde91bb11aeba730 /mesonbuild/interpreter.py
parentbc347aed0be4d8ea6210a546fb350f7bc1eee529 (diff)
parent70e84f908024329268bfc084282a9e88e1736076 (diff)
downloadmeson-cc775d64c9ca73e9a02710a84ac9f0a5fc01c593.zip
meson-cc775d64c9ca73e9a02710a84ac9f0a5fc01c593.tar.gz
meson-cc775d64c9ca73e9a02710a84ac9f0a5fc01c593.tar.bz2
Merge pull request #618 from mesonbuild/rtrehaul
Rework run_target to mirror custom_target.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py73
1 files changed, 53 insertions, 20 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index c997e0e..5281be5 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -23,11 +23,13 @@ from . import compilers
from .wrap import wrap
from . import mesonlib
-import os, sys, platform, subprocess, shutil, uuid, re
+import os, sys, subprocess, shutil, uuid, re
from functools import wraps
import importlib
+run_depr_printed = False
+
class InterpreterException(mesonlib.MesonException):
pass
@@ -473,6 +475,7 @@ class BuildTargetHolder(InterpreterObject):
'extract_all_objects' : self.extract_all_objects_method,
'get_id': self.get_id_method,
'outdir' : self.outdir_method,
+ 'full_path' : self.full_path_method,
'private_dir_include' : self.private_dir_include_method,
})
@@ -483,6 +486,9 @@ class BuildTargetHolder(InterpreterObject):
return IncludeDirsHolder(build.IncludeDirs('', [], False,
[self.interpreter.backend.get_target_private_dir(self.held_object)]))
+ def full_path_method(self, args, kwargs):
+ return self.interpreter.backend.get_target_filename_abs(self.held_object)
+
def outdir_method(self, args, kwargs):
return self.interpreter.backend.get_target_dir(self.held_object)
@@ -514,19 +520,19 @@ class JarHolder(BuildTargetHolder):
super().__init__(target, interp)
class CustomTargetHolder(InterpreterObject):
- def __init__(self, object_to_hold):
+ def __init__(self, object_to_hold, interp):
+ super().__init__()
self.held_object = object_to_hold
+ self.interpreter = interp
+ self.methods.update({'full_path' : self.full_path_method,
+ })
- def is_cross(self):
- return self.held_object.is_cross()
-
- def extract_objects_method(self, args, kwargs):
- gobjs = self.held_object.extract_objects(args)
- return GeneratedObjectsHolder(gobjs)
+ def full_path_method(self, args, kwargs):
+ return self.interpreter.backend.get_target_filename_abs(self.held_object)
class RunTargetHolder(InterpreterObject):
- def __init__(self, name, command, args, subdir):
- self.held_object = build.RunTarget(name, command, args, subdir)
+ def __init__(self, name, command, args, dependencies, subdir):
+ self.held_object = build.RunTarget(name, command, args, dependencies, subdir)
class Test(InterpreterObject):
def __init__(self, name, suite, exe, is_parallel, cmd_args, env, should_fail, valgrind_args, timeout, workdir):
@@ -1069,7 +1075,7 @@ class Interpreter():
for v in invalues:
if isinstance(v, build.CustomTarget):
self.add_target(v.name, v)
- outvalues.append(CustomTargetHolder(v))
+ outvalues.append(CustomTargetHolder(v, self))
elif isinstance(v, int) or isinstance(v, str):
outvalues.append(v)
elif isinstance(v, build.Executable):
@@ -1754,16 +1760,32 @@ class Interpreter():
if len(args) != 1:
raise InterpreterException('Incorrect number of arguments')
name = args[0]
- tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, kwargs))
+ tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, kwargs), self)
self.add_target(name, tg.held_object)
return tg
- @noKwargs
def func_run_target(self, node, args, kwargs):
- if len(args) < 2:
- raise InterpreterException('Incorrect number of arguments')
+ global run_depr_printed
+ if len(args) > 1:
+ if not run_depr_printed:
+ mlog.log(mlog.red('DEPRECATION'), 'positional version of run_target is deprecated, use the keyword version instead.')
+ run_depr_printed = True
+ if 'command' in kwargs:
+ raise InterpreterException('Can not have command both in positional and keyword arguments.')
+ all_args = args[1:]
+ deps = []
+ elif len(args) == 1:
+ if not 'command' in kwargs:
+ raise InterpreterException('Missing "command" keyword argument')
+ all_args = kwargs['command']
+ deps = kwargs.get('depends', [])
+ if not isinstance(deps, list):
+ deps = [deps]
+ else:
+ raise InterpreterException('Run_target needs at least one positional argument.')
+
cleaned_args = []
- for i in args:
+ for i in all_args:
try:
i = i.held_object
except AttributeError:
@@ -1772,10 +1794,21 @@ class Interpreter():
mlog.debug('Wrong type:', str(i))
raise InterpreterException('Invalid argument to run_target.')
cleaned_args.append(i)
- name = cleaned_args[0]
- command = cleaned_args[1]
- cmd_args = cleaned_args[2:]
- tg = RunTargetHolder(name, command, cmd_args, self.subdir)
+ name = args[0]
+ if not isinstance(name, str):
+ raise InterpreterException('First argument must be a string.')
+ cleaned_deps = []
+ for d in deps:
+ try:
+ d = d.held_object
+ except AttributeError:
+ pass
+ if not isinstance(d, (build.BuildTarget, build.CustomTarget)):
+ raise InterpreterException('Depends items must be build targets.')
+ cleaned_deps.append(d)
+ command = cleaned_args[0]
+ cmd_args = cleaned_args[1:]
+ tg = RunTargetHolder(name, command, cmd_args, cleaned_deps, self.subdir)
self.add_target(name, tg.held_object)
return tg