aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--authors.txt1
-rw-r--r--build.py6
-rw-r--r--interpreter.py17
-rwxr-xr-xmeson.py3
-rwxr-xr-xmesonconf.py5
-rw-r--r--mesonlib.py18
-rw-r--r--ninjabackend.py8
-rw-r--r--test cases/common/49 subproject/meson.build4
-rw-r--r--test cases/common/49 subproject/subprojects/sublib/meson.build4
-rw-r--r--test cases/common/98 gen extra/meson.build13
-rw-r--r--test cases/common/98 gen extra/name.dat1
-rw-r--r--test cases/common/98 gen extra/plain.c5
-rwxr-xr-xtest cases/common/98 gen extra/srcgen.py26
-rw-r--r--test cases/common/98 gen extra/upper.c5
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
diff --git a/build.py b/build.py
index 5c200c1..54b5b69 100644
--- a/build.py
+++ b/build.py
@@ -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
diff --git a/meson.py b/meson.py
index f051abd..e7428dd 100755
--- a/meson.py
+++ b/meson.py
@@ -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();
+}