diff options
-rw-r--r-- | authors.txt | 1 | ||||
-rw-r--r-- | build.py | 6 | ||||
-rw-r--r-- | interpreter.py | 17 | ||||
-rwxr-xr-x | meson.py | 3 | ||||
-rwxr-xr-x | mesonconf.py | 5 | ||||
-rw-r--r-- | mesonlib.py | 18 | ||||
-rw-r--r-- | ninjabackend.py | 8 | ||||
-rw-r--r-- | test cases/common/49 subproject/meson.build | 4 | ||||
-rw-r--r-- | test cases/common/49 subproject/subprojects/sublib/meson.build | 4 | ||||
-rw-r--r-- | test cases/common/98 gen extra/meson.build | 13 | ||||
-rw-r--r-- | test cases/common/98 gen extra/name.dat | 1 | ||||
-rw-r--r-- | test cases/common/98 gen extra/plain.c | 5 | ||||
-rwxr-xr-x | test cases/common/98 gen extra/srcgen.py | 26 | ||||
-rw-r--r-- | test cases/common/98 gen extra/upper.c | 5 |
14 files changed, 103 insertions, 13 deletions
diff --git a/authors.txt b/authors.txt index 315c25a..c3720b5 100644 --- a/authors.txt +++ b/authors.txt @@ -24,3 +24,4 @@ German Diago Gomez Kyle Manna Haakon Sporsheim Wink Saville +Yoav Alon
\ No newline at end of file @@ -579,7 +579,7 @@ class Generator(): return self.arglist class GeneratedList(): - def __init__(self, generator): + def __init__(self, generator, extra_args=[]): if hasattr(generator, 'held_object'): generator = generator.held_object self.generator = generator @@ -587,6 +587,7 @@ class GeneratedList(): self.outfilelist = [] self.outmap = {} self.extra_depends = [] + self.extra_args = extra_args def add_file(self, newfile): self.infilelist.append(newfile) @@ -606,6 +607,9 @@ class GeneratedList(): def get_generator(self): return self.generator + def get_extra_args(self): + return self.extra_args + class Executable(BuildTarget): def __init__(self, name, subdir, subproject, is_cross, sources, objects, environment, kwargs): super().__init__(name, subdir, subproject, is_cross, sources, objects, environment, kwargs) diff --git a/interpreter.py b/interpreter.py index 6fe0212..cacfe05 100644 --- a/interpreter.py +++ b/interpreter.py @@ -290,18 +290,17 @@ class GeneratorHolder(InterpreterObject): self.methods.update({'process' : self.process_method}) def process_method(self, args, kwargs): - if len(kwargs) > 0: - raise InvalidArguments('Process does not take keyword arguments.') check_stringlist(args) - gl = GeneratedListHolder(self) + extras = mesonlib.stringlistify(kwargs.get('extra_args', [])) + gl = GeneratedListHolder(self, extras) [gl.add_file(os.path.join(self.interpreter.subdir, a)) for a in args] return gl class GeneratedListHolder(InterpreterObject): - def __init__(self, arg1): + def __init__(self, arg1, extra_args=[]): super().__init__() if isinstance(arg1, GeneratorHolder): - self.held_object = build.GeneratedList(arg1.held_object) + self.held_object = build.GeneratedList(arg1.held_object, extra_args) else: self.held_object = arg1 @@ -872,7 +871,7 @@ class MesonMain(InterpreterObject): self.build.dep_manifest_name = args[0] def project_version_method(self, args, kwargs): - return self.build.dep_manifest[self.interpreter.active_projectname] + return self.build.dep_manifest[self.interpreter.active_projectname]['version'] class Interpreter(): @@ -1378,7 +1377,9 @@ class Interpreter(): self.parse_default_options(kwargs['default_options']) self.active_projectname = args[0] self.project_version = kwargs.get('version', 'undefined') - self.build.dep_manifest[args[0]] = self.project_version + license = mesonlib.stringlistify(kwargs.get('license', 'unknown')) + self.build.dep_manifest[args[0]] = {'version': self.project_version, + 'license': license} if self.subproject in self.build.projects: raise InvalidCode('Second call to project().') if not self.is_subproject() and 'subproject_dir' in kwargs: @@ -1395,7 +1396,7 @@ class Interpreter(): langs = self.coredata.compilers.keys() if 'vala' in langs: if not 'c' in langs: - raise InterpreterException('Compiling Vala requires a C compiler') + raise InterpreterException('Compiling Vala requires C. Add C to your project languages and rerun Meson.') @noKwargs @stringArgs @@ -174,6 +174,9 @@ def run(args): handshake = True else: handshake = False + args = mesonlib.expand_arguments(args) + if not args: + return 1 options = parser.parse_args(args[1:]) if options.print_version: print(coredata.version) diff --git a/mesonconf.py b/mesonconf.py index 228ace5..e53875f 100755 --- a/mesonconf.py +++ b/mesonconf.py @@ -180,7 +180,10 @@ class Conf: self.print_aligned(optarr) if __name__ == '__main__': - options = parser.parse_args() + args = mesonlib.expand_arguments(sys.argv[:]) + if not args: + sys.exit(1) + options = parser.parse_args(args[1:]) if len(options.directory) > 1: print('%s <build directory>' % sys.argv[0]) print('If you omit the build directory, the current directory is substituted.') diff --git a/mesonlib.py b/mesonlib.py index bb69632..99d6154 100644 --- a/mesonlib.py +++ b/mesonlib.py @@ -264,3 +264,21 @@ def stringlistify(item): if not isinstance(i, str): raise MesonException('List item not a string.') return item + +def expand_arguments(args): + expended_args = [] + for arg in args: + if not arg.startswith('@'): + expended_args.append(arg) + continue + + args_file = arg[1:] + try: + with open(args_file) as f: + extended_args = f.read().split() + expended_args += extended_args + except Exception as e: + print('Error expanding command line arguments, %s not found' % args_file) + print(e) + return None + return expended_args diff --git a/ninjabackend.py b/ninjabackend.py index 559c006..7d72e06 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -1152,7 +1152,13 @@ rule FORTRAN_DEP_HACK relout = self.get_target_private_dir(target) args = [x.replace("@SOURCE_DIR@", self.build_to_src).replace("@BUILD_DIR@", relout) for x in args] - cmdlist = exe_arr + args + final_args = [] + for a in args: + if a == '@EXTRA_ARGS@': + final_args += genlist.get_extra_args() + else: + final_args.append(a) + cmdlist = exe_arr + final_args elem = NinjaBuildElement(outfiles, 'CUSTOM_COMMAND', infilename) if len(extra_dependencies) > 0: elem.add_dep(extra_dependencies) diff --git a/test cases/common/49 subproject/meson.build b/test cases/common/49 subproject/meson.build index 2616853..1e05ddf 100644 --- a/test cases/common/49 subproject/meson.build +++ b/test cases/common/49 subproject/meson.build @@ -1,4 +1,6 @@ -project('subproj user', 'c', version : '2.3.4') +project('subproj user', 'c', + version : '2.3.4', + license : 'mylicense') sub = subproject('sublib', version : '1.0.0') diff --git a/test cases/common/49 subproject/subprojects/sublib/meson.build b/test cases/common/49 subproject/subprojects/sublib/meson.build index 922c6cf..3da031b 100644 --- a/test cases/common/49 subproject/subprojects/sublib/meson.build +++ b/test cases/common/49 subproject/subprojects/sublib/meson.build @@ -1,4 +1,6 @@ -project('subproject', 'c', version : '1.0.0') +project('subproject', 'c', + version : '1.0.0', + license : ['sublicense1', 'sublicense2']) if not meson.is_subproject() error('Claimed to be master project even though we are a subproject.') diff --git a/test cases/common/98 gen extra/meson.build b/test cases/common/98 gen extra/meson.build new file mode 100644 index 0000000..52ed847 --- /dev/null +++ b/test cases/common/98 gen extra/meson.build @@ -0,0 +1,13 @@ +project('extra args in gen', 'c') + +prog = find_program('srcgen.py') + +gen = generator(prog, + output : '@BASENAME@.c', + arguments : ['--input=@INPUT@', '--output=@OUTPUT@', '@EXTRA_ARGS@']) + +g1 = gen.process('name.dat') +g2 = gen.process('name.dat', extra_args: '--upper') + +test('basic', executable('basic', 'plain.c', g1)) +test('upper', executable('upper', 'upper.c', g2)) diff --git a/test cases/common/98 gen extra/name.dat b/test cases/common/98 gen extra/name.dat new file mode 100644 index 0000000..caf5b1c --- /dev/null +++ b/test cases/common/98 gen extra/name.dat @@ -0,0 +1 @@ +bob_mcbob diff --git a/test cases/common/98 gen extra/plain.c b/test cases/common/98 gen extra/plain.c new file mode 100644 index 0000000..3845aee --- /dev/null +++ b/test cases/common/98 gen extra/plain.c @@ -0,0 +1,5 @@ +int bob_mcbob(); + +int main(int argc, char **argv) { + return bob_mcbob(); +} diff --git a/test cases/common/98 gen extra/srcgen.py b/test cases/common/98 gen extra/srcgen.py new file mode 100755 index 0000000..55e777e --- /dev/null +++ b/test cases/common/98 gen extra/srcgen.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +import sys +import os +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument('--input', dest='input', + help='the input file') +parser.add_argument('--output', dest='output', + help='the output file') +parser.add_argument('--upper', dest='upper', action='store_true', default=False, + help='Convert to upper case.') + +c_templ = '''int %s() { + return 0; +} +''' + +options = parser.parse_args(sys.argv[1:]) + +funcname = open(options.input).readline().strip() +if options.upper: + funcname = funcname.upper() + +open(options.output, 'w').write(c_templ % funcname) diff --git a/test cases/common/98 gen extra/upper.c b/test cases/common/98 gen extra/upper.c new file mode 100644 index 0000000..44f8ad7 --- /dev/null +++ b/test cases/common/98 gen extra/upper.c @@ -0,0 +1,5 @@ +int BOB_MCBOB(); + +int main(int argc, char **argv) { + return BOB_MCBOB(); +} |