summaryrefslogtreecommitdiffstats
path: root/mojo
diff options
context:
space:
mode:
authorviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-23 18:23:47 +0000
committerviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-23 18:23:47 +0000
commit9feac639c797d30cda278dded8dc4b6fa32565ed (patch)
tree87523fdcbb2f3dcb5d75a0ccb929577329aadb3b /mojo
parent24acab7d211158eeac0e57f7be7b80da78862399 (diff)
downloadchromium_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.py10
-rwxr-xr-xmojo/public/bindings/mojom_bindings_generator.py35
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())