aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-02-23 23:00:00 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-02-23 23:00:00 +0200
commit7abe15a7baf6065b10a121b10f6d9edda6ed8280 (patch)
treee9423cfe9649e42f6cb7688782c79cd6d20db0b5
parent15aa29bf158c65a70d555c0d5b507ccfc6e84cca (diff)
downloadmeson-7abe15a7baf6065b10a121b10f6d9edda6ed8280.zip
meson-7abe15a7baf6065b10a121b10f6d9edda6ed8280.tar.gz
meson-7abe15a7baf6065b10a121b10f6d9edda6ed8280.tar.bz2
Pipeline backend is done and works.
-rwxr-xr-xbackends.py24
-rwxr-xr-xinterpreter.py6
-rw-r--r--test cases/30 pipeline/meson.build2
3 files changed, 32 insertions, 0 deletions
diff --git a/backends.py b/backends.py
index 1cf7778..adce252 100755
--- a/backends.py
+++ b/backends.py
@@ -85,6 +85,7 @@ class Backend():
return
self.process_target_dependencies(target, outfile)
print('Generating target', name)
+ self.generate_custom_generator_rules(target, outfile)
outname = self.get_target_filename(target)
obj_list = []
if target.has_pch():
@@ -347,6 +348,29 @@ class NinjaBackend(Backend):
outfile.write('\n')
outfile.write('\n')
+ def generate_custom_generator_rules(self, target, outfile):
+ for genlist in target.get_generated_sources():
+ generator = genlist.get_generator()
+ exe = generator.get_exe()
+ infilelist = genlist.get_infilelist()
+ outfilelist = genlist.get_outfilelist()
+ if len(infilelist) != len(outfilelist):
+ raise RuntimeError('Internal data structures broken.')
+ exe_file = os.path.join(self.environment.get_build_dir(), self.get_target_filename(exe))
+ base_args = generator.get_arglist()
+ for i in range(len(infilelist)):
+ infilename = os.path.join(self.build_to_src, infilelist[i])
+ outfilename = os.path.join(self.get_target_dir(target), outfilelist[i])
+ args = [x.replace("@INPUTNAME@", infilename).replace('@OUTPUTNAME@', outfilename)\
+ for x in base_args]
+ cmdlist = [exe_file] + args
+ build = 'build %s: CUSTOM_COMMAND %s | %s\n' % \
+ (ninja_quote(outfilename), ninja_quote(infilename), ninja_quote(self.get_target_filename(exe)))
+ command = ' COMMAND = %s\n\n' % \
+ ' '.join(["'%s'" % ninja_quote(i) for i in cmdlist])
+ outfile.write(build)
+ outfile.write(command)
+
def generate_single_compile(self, target, outfile, src, is_generated=False):
compiler = self.get_compiler_for_source(src)
commands = self.generate_basic_compiler_flags(target, compiler)
diff --git a/interpreter.py b/interpreter.py
index 67ee6a3..2a79b87 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -50,6 +50,9 @@ class Generator(InterpreterObject):
self.methods.update({'process' : self.process_method})
self.process_kwargs(kwargs)
+ def get_exe(self):
+ return self.exe
+
def process_kwargs(self, kwargs):
if 'arguments' not in kwargs:
raise InvalidArguments('Generator must have "arguments" keyword argument.')
@@ -90,6 +93,9 @@ class Generator(InterpreterObject):
[gl.add_file(a) for a in args]
return gl
+ def get_arglist(self):
+ return self.arglist
+
class GeneratedList(InterpreterObject):
def __init__(self, generator):
InterpreterObject.__init__(self)
diff --git a/test cases/30 pipeline/meson.build b/test cases/30 pipeline/meson.build
index 64b28ce..f43d18c 100644
--- a/test cases/30 pipeline/meson.build
+++ b/test cases/30 pipeline/meson.build
@@ -9,3 +9,5 @@ arguments : ['@INPUTNAME@', '@OUTPUTNAME@'])
generated = gen.process('input_src.dat')
e2 = executable('prog', 'prog.c', gen_src : generated)
+
+add_test('pipelined', e2)