diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-23 18:23:47 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-23 18:23:47 +0000 |
commit | 9feac639c797d30cda278dded8dc4b6fa32565ed (patch) | |
tree | 87523fdcbb2f3dcb5d75a0ccb929577329aadb3b /mojo | |
parent | 24acab7d211158eeac0e57f7be7b80da78862399 (diff) | |
download | chromium_src-9feac639c797d30cda278dded8dc4b6fa32565ed.zip chromium_src-9feac639c797d30cda278dded8dc4b6fa32565ed.tar.gz chromium_src-9feac639c797d30cda278dded8dc4b6fa32565ed.tar.bz2 |
Mojo: Make the bindings generator able to dynamically load a generator.
Notes:
- Currently --generators=.../generators/mojom_cpp_generator.py won't
work; the python module path won't be right for it to just do "import
mojom" (etc.). Instead, an explicitly-specified generator would have
to do something like "from generators import mojom".
- @UseJinja's path_to_template argument is now relative to the directory
containing the *caller's* file (i.e., the generator's file), not the
directory containing template_expander.py.
Still to do:
- Factory out the generator "library" files to a separate directory,
away from specific (e.g., C++) generators. (Maybe move all the
libraries into a pylib/ directory, and add that directory to the
module path.)
- Make it so that --generators=.../mojom_cpp_generator.py works as
expected.
R=davemoore@chromium.org
Review URL: https://codereview.chromium.org/140523003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@246649 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
-rw-r--r-- | mojo/public/bindings/generators/template_expander.py | 10 | ||||
-rwxr-xr-x | mojo/public/bindings/mojom_bindings_generator.py | 35 |
2 files changed, 37 insertions, 8 deletions
diff --git a/mojo/public/bindings/generators/template_expander.py b/mojo/public/bindings/generators/template_expander.py index 41c3cc7..7d56624 100644 --- a/mojo/public/bindings/generators/template_expander.py +++ b/mojo/public/bindings/generators/template_expander.py @@ -5,6 +5,7 @@ # Based on: # http://src.chromium.org/viewvc/blink/trunk/Source/build/scripts/template_expander.py +import inspect import os import sys @@ -20,9 +21,9 @@ sys.path.insert(1, os.path.join(_current_dir, import jinja2 -def ApplyTemplate(path_to_template, params, filters=None): +def ApplyTemplate(base_dir, path_to_template, params, filters=None): template_directory, template_name = os.path.split(path_to_template) - path_to_templates = os.path.join(_current_dir, template_directory) + path_to_templates = os.path.join(base_dir, template_directory) loader = jinja2.FileSystemLoader([path_to_templates]) jinja_env = jinja2.Environment(loader=loader, keep_trailing_newline=True) if filters: @@ -32,10 +33,13 @@ def ApplyTemplate(path_to_template, params, filters=None): def UseJinja(path_to_template, filters=None): + # Get the directory of our caller's file. + base_dir = os.path.dirname(inspect.getfile(sys._getframe(1))) def RealDecorator(generator): def GeneratorInternal(*args, **kwargs): parameters = generator(*args, **kwargs) - return ApplyTemplate(path_to_template, parameters, filters=filters) + return ApplyTemplate(base_dir, path_to_template, parameters, + filters=filters) GeneratorInternal.func_name = generator.func_name return GeneratorInternal return RealDecorator diff --git a/mojo/public/bindings/mojom_bindings_generator.py b/mojo/public/bindings/mojom_bindings_generator.py index 91eb501..6f8aea4 100755 --- a/mojo/public/bindings/mojom_bindings_generator.py +++ b/mojo/public/bindings/mojom_bindings_generator.py @@ -6,14 +6,34 @@ """The frontend for the Mojo bindings system.""" +import imp import os import sys from argparse import ArgumentParser +from generators import mojom_data from parse import mojo_parser from parse import mojo_translate -from generators import mojom_data -from generators import mojom_cpp_generator -from generators import mojom_js_generator + + +def LoadGenerators(generators_string): + generators = [] + for generator_name in [s.strip() for s in generators_string.split(",")]: + # "Built-in" generators: + if generator_name.lower() == "c++": + generator_module = __import__("generators.mojom_cpp_generator", + fromlist=["mojom_cpp_generator"]) + elif generator_name.lower() == "javascript": + generator_module = __import__("generators.mojom_js_generator", + fromlist=["mojom_js_generator"]) + # Specified generator python module: + elif generator_name.endswith(".py"): + generator_module = imp.load_source(os.path.basename(generator_name)[:-3], + generator_name) + else: + print "Unknown generator name %s" % generator_name + sys.exit(1) + generators.append(generator_module) + return generators def Main(): @@ -24,11 +44,14 @@ def Main(): help="include path for #includes") parser.add_argument("-o", "--output_dir", dest="output_dir", default=".", help="output directory for generated files") + parser.add_argument("-g", "--generators", dest="generators_string", + metavar="GENERATORS", default="c++,javascript", + help="comma-separated list of generators") args = parser.parse_args() # TODO(vtl): Load these dynamically. (Also add a command-line option to # specify which generators.) - generator_modules = [mojom_cpp_generator, mojom_js_generator] + generator_modules = LoadGenerators(args.generators_string) if not os.path.exists(args.output_dir): os.makedirs(args.output_dir) @@ -45,6 +68,8 @@ def Main(): args.output_dir) generator.GenerateFiles() + return 0 + if __name__ == "__main__": - Main() + sys.exit(Main()) |