Home | History | Annotate | Download | only in bindings
      1 # Copyright 2014 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 # Generate C++ and JavaScript source files from mojom files. The output files
      6 # will go under the generated file directory tree with the same path as each
      7 # input file.
      8 #
      9 # Parameters:
     10 #
     11 #   sources (required)
     12 #       List of source .mojom files to compile.
     13 #
     14 #   deps (optional)
     15 #
     16 #   public_deps (optional)
     17 #
     18 #   testonly (optional)
     19 #
     20 #   visibility (optional)
     21 template("mojom") {
     22   assert(defined(invoker.sources),
     23          "\"sources\" must be defined for the $target_name template.")
     24 
     25   generator_root = "//mojo/public/tools/bindings"
     26   generator_script = "$generator_root/mojom_bindings_generator.py"
     27   generator_sources = [
     28     generator_script,
     29     "$generator_root/generators/cpp_templates/enum_declaration.tmpl",
     30     "$generator_root/generators/cpp_templates/interface_declaration.tmpl",
     31     "$generator_root/generators/cpp_templates/interface_definition.tmpl",
     32     "$generator_root/generators/cpp_templates/interface_macros.tmpl",
     33     "$generator_root/generators/cpp_templates/interface_proxy_declaration.tmpl",
     34     "$generator_root/generators/cpp_templates/interface_request_validator_declaration.tmpl",
     35     "$generator_root/generators/cpp_templates/interface_response_validator_declaration.tmpl",
     36     "$generator_root/generators/cpp_templates/interface_stub_declaration.tmpl",
     37     "$generator_root/generators/cpp_templates/module.cc.tmpl",
     38     "$generator_root/generators/cpp_templates/module.h.tmpl",
     39     "$generator_root/generators/cpp_templates/module-internal.h.tmpl",
     40     "$generator_root/generators/cpp_templates/params_definition.tmpl",
     41     "$generator_root/generators/cpp_templates/struct_declaration.tmpl",
     42     "$generator_root/generators/cpp_templates/struct_definition.tmpl",
     43     "$generator_root/generators/cpp_templates/struct_serialization_declaration.tmpl",
     44     "$generator_root/generators/cpp_templates/struct_serialization_definition.tmpl",
     45     "$generator_root/generators/cpp_templates/struct_macros.tmpl",
     46     "$generator_root/generators/cpp_templates/wrapper_class_declaration.tmpl",
     47     "$generator_root/generators/cpp_templates/wrapper_class_definition.tmpl",
     48     "$generator_root/generators/js_templates/enum_definition.tmpl",
     49     "$generator_root/generators/js_templates/interface_definition.tmpl",
     50     "$generator_root/generators/js_templates/module.js.tmpl",
     51     "$generator_root/generators/js_templates/struct_definition.tmpl",
     52     "$generator_root/generators/python_templates/module_macros.tmpl",
     53     "$generator_root/generators/python_templates/module.py.tmpl",
     54     "$generator_root/generators/mojom_cpp_generator.py",
     55     "$generator_root/generators/mojom_js_generator.py",
     56     "$generator_root/generators/mojom_python_generator.py",
     57     "$generator_root/pylib/mojom/__init__.py",
     58     "$generator_root/pylib/mojom/error.py",
     59     "$generator_root/pylib/mojom/generate/__init__.py",
     60     "$generator_root/pylib/mojom/generate/data.py",
     61     "$generator_root/pylib/mojom/generate/generator.py",
     62     "$generator_root/pylib/mojom/generate/module.py",
     63     "$generator_root/pylib/mojom/generate/pack.py",
     64     "$generator_root/pylib/mojom/generate/template_expander.py",
     65     "$generator_root/pylib/mojom/parse/__init__.py",
     66     "$generator_root/pylib/mojom/parse/ast.py",
     67     "$generator_root/pylib/mojom/parse/lexer.py",
     68     "$generator_root/pylib/mojom/parse/parser.py",
     69     "$generator_root/pylib/mojom/parse/translate.py",
     70   ]
     71   generator_cpp_outputs = [
     72     "{{source_gen_dir}}/{{source_name_part}}.mojom.cc",
     73     "{{source_gen_dir}}/{{source_name_part}}.mojom.h",
     74     "{{source_gen_dir}}/{{source_name_part}}.mojom-internal.h",
     75   ]
     76   generator_js_outputs = [
     77     "{{source_gen_dir}}/{{source_name_part}}.mojom.js",
     78   ]
     79   generator_python_outputs = [
     80     "{{source_gen_dir}}/{{source_name_part}}_mojom.py",
     81   ]
     82 
     83   if (defined(invoker.visibility)) {
     84     # Need to save this because the the target_name is overwritten inside the
     85     # action to be that of the action itself. Only define this in the case the
     86     # var is used to avoid unused var error.
     87     target_visibility = [ ":$target_name" ]
     88   }
     89 
     90   generator_target_name = target_name + "__generator"
     91   action_foreach(generator_target_name) {
     92     if (defined(invoker.visibility)) {
     93       visibility = target_visibility + invoker.visibility
     94     }
     95     script = generator_script
     96     inputs = generator_sources
     97     sources = invoker.sources
     98     outputs = generator_cpp_outputs +
     99               generator_js_outputs +
    100               generator_python_outputs
    101     args = [
    102       "{{source}}",
    103       "--use_chromium_bundled_pylibs",
    104       "-d", rebase_path("//", root_build_dir),
    105       "-I", rebase_path("//", root_build_dir),
    106       "-o", "{{source_gen_dir}}",
    107     ]
    108   }
    109 
    110   source_set(target_name) {
    111     if (defined(invoker.visibility)) {
    112       visibility = invoker.visibility
    113     }
    114     if (defined(invoker.testonly)) {
    115       testonly = invoker.testonly
    116     }
    117     sources = process_file_template(invoker.sources, generator_cpp_outputs)
    118     data = process_file_template(invoker.sources, generator_js_outputs)
    119     deps = [
    120       ":$generator_target_name",
    121       "//mojo/public/cpp/bindings",
    122     ]
    123     if (defined(invoker.deps)) {
    124       deps += invoker.deps
    125     }
    126     if (defined(invoker.public_deps)) {
    127       public_deps = invoker.public_deps
    128     }
    129   }
    130 }
    131