From a869da185f076a81b65ebd55f074a26c6e6b8466 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Mon, 1 Apr 2013 18:06:27 +0300 Subject: [PATCH] Can generate custom rules for dependencies. --- backends.py | 18 ++++++++++++++++++ dependencies.py | 20 ++++++++++++++++++++ test cases/frameworks/4 qt5/mainWindow.h | 1 + 3 files changed, 39 insertions(+) diff --git a/backends.py b/backends.py index f45c4727f..b2f8ba5bf 100755 --- a/backends.py +++ b/backends.py @@ -418,12 +418,30 @@ class NinjaBackend(Backend): datafile.write(self.get_target_filename(t.get_exe()) + '\n') datafile.close() + def generate_dep_gen_rules(self, outfile): + outfile.write('# Rules for external dependency generators.\n\n') + processed = {} + for dep in self.environment.coredata.deps.values(): + name = dep.get_name() + if name in processed: + continue + processed[name] = True + for rule in dep.get_generate_rules(): + outfile.write('rule %s\n' % rule.name) + command = ' '.join([ninja_quote(x) for x in rule.cmd_list]) + command = command.replace('@INFILE@', '$in').replace('@OUTFILE@', '$out') + outfile.write(' command = %s\n' % command) + desc = rule.description.replace('@INFILE@', '$in') + outfile.write(' description = %s\n' % desc) + outfile.write('\n') + def generate_rules(self, outfile): outfile.write('# Rules for compiling.\n\n') self.generate_compile_rules(outfile) outfile.write('# Rules for linking.\n\n') self.generate_static_link_rules(outfile) self.generate_dynamic_link_rules(outfile) + self.generate_dep_gen_rules(outfile) outfile.write('# Other rules\n\n') outfile.write('rule CUSTOM_COMMAND\n') outfile.write(' command = $COMMAND\n') diff --git a/dependencies.py b/dependencies.py index f689f8b4d..d14f68c43 100644 --- a/dependencies.py +++ b/dependencies.py @@ -28,6 +28,14 @@ class DependencyException(MesonException): def __init__(self, *args, **kwargs): MesonException.__init__(self, *args, **kwargs) +class CustomRule: + def __init__(self, cmd_list, name_templ, src_keyword, name, description): + self.cmd_list = cmd_list + self.name_templ = name_templ + self.src_keyword = src_keyword + self.name = name + self.description = description + class Dependency(): def __init__(self): self.name = "null" @@ -49,6 +57,11 @@ class Dependency(): def get_name(self): return self.name + # Rules for commands to execute before compilation + # such as Qt's moc preprocessor. + def get_generate_rules(self): + return [] + class PkgConfigDependency(Dependency): pkgconfig_found = False @@ -316,6 +329,13 @@ class Qt5Dependency(Dependency): return False return True + def get_generate_rules(self): + moc_rule = CustomRule([self.moc.get_command(), '@INFILE@', '-o', '@OUTFILE@'], + 'moc_%BASENAME%.cpp','moc_headers', 'moc_compile', + 'Compiling @INFILE@ with the moc preprocessor') + return [moc_rule] + + def get_dep_identifier(name, kwargs): elements = [name] modlist = kwargs.get('modules', []) diff --git a/test cases/frameworks/4 qt5/mainWindow.h b/test cases/frameworks/4 qt5/mainWindow.h index 369c6d3fb..6fcedc28d 100644 --- a/test cases/frameworks/4 qt5/mainWindow.h +++ b/test cases/frameworks/4 qt5/mainWindow.h @@ -1,3 +1,4 @@ +#include #include #include "ui_mainWindow.h"