| # Copyright 2014 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | import("../../mojo_sdk.gni") | 
 |  | 
 | # Generate C++ and JavaScript source files from mojom files. The output files | 
 | # will go under the generated file directory tree with the same path as each | 
 | # input file. | 
 | # | 
 | # If a mojom target is intended for use in a client repo where the location of | 
 | # the Mojo SDK will be different than its location in the Mojo repo, | 
 | # dependencies on the SDK should be specified relative to the parent directory | 
 | # of the Mojo public SDK in |mojo_sdk_deps| rather than via absolute paths in | 
 | # |deps|. | 
 | # | 
 | # Parameters: | 
 | # | 
 | #   sources (optional if one of the deps sets listed below is present) | 
 | #       List of source .mojom files to compile. | 
 | # | 
 | #   deps (optional) | 
 | #       Note: this can contain only other mojom targets. | 
 | # | 
 | #   mojo_sdk_deps (optional) | 
 | #       List of deps specified relative to the parent directory of the Mojo | 
 | #       public SDK. These deps will be added as ordinary deps rebased to the | 
 | #       current directory. | 
 | # | 
 | #   public_deps (optional) | 
 | #       Note: this can contain only other mojom targets. | 
 | # | 
 | #   mojo_sdk_public_deps (optional) | 
 | #       List of public deps specified relative to the parent directory of the | 
 | #       Mojo public SDK. These deps will be added as ordinary public deps | 
 | #       rebased to the current directory. | 
 | # | 
 | #   import_dirs (optional) | 
 | #       List of import directories that will get added when processing sources. | 
 | # | 
 | #   testonly (optional) | 
 | # | 
 | #   visibility (optional) | 
 | template("mojom") { | 
 |   assert( | 
 |       defined(invoker.sources) || defined(invoker.deps) || | 
 |           defined(invoker.public_deps) || defined(invoker.mojo_sdk_deps) || | 
 |           defined(invoker.mojo_sdk_public_deps), | 
 |       "\"sources\" or \"deps\" must be defined for the $target_name template.") | 
 |  | 
 |   if (defined(invoker.sources)) { | 
 |     generator_root = rebase_path("mojo/public/tools/bindings", ".", mojo_root) | 
 |     generator_script = "$generator_root/mojom_bindings_generator.py" | 
 |     generator_sources = [ | 
 |       generator_script, | 
 |       "$generator_root/generators/cpp_templates/enum_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_macros.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_proxy_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_request_validator_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_response_validator_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/interface_stub_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/module-internal.h.tmpl", | 
 |       "$generator_root/generators/cpp_templates/module.cc.tmpl", | 
 |       "$generator_root/generators/cpp_templates/module.h.tmpl", | 
 |       "$generator_root/generators/cpp_templates/struct_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/struct_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/struct_macros.tmpl", | 
 |       "$generator_root/generators/cpp_templates/struct_serialization_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/struct_serialization_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/union_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/union_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/union_serialization_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/union_serialization_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/validation_macros.tmpl", | 
 |       "$generator_root/generators/cpp_templates/wrapper_class_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/wrapper_class_definition.tmpl", | 
 |       "$generator_root/generators/cpp_templates/wrapper_union_class_declaration.tmpl", | 
 |       "$generator_root/generators/cpp_templates/wrapper_union_class_definition.tmpl", | 
 |       "$generator_root/generators/dart_templates/enum_definition.tmpl", | 
 |       "$generator_root/generators/dart_templates/interface_definition.tmpl", | 
 |       "$generator_root/generators/dart_templates/module.lib.tmpl", | 
 |       "$generator_root/generators/dart_templates/module_definition.tmpl", | 
 |       "$generator_root/generators/dart_templates/struct_definition.tmpl", | 
 |       "$generator_root/generators/go_templates/enum.tmpl", | 
 |       "$generator_root/generators/go_templates/interface.tmpl", | 
 |       "$generator_root/generators/go_templates/source.tmpl", | 
 |       "$generator_root/generators/go_templates/struct.tmpl", | 
 |       "$generator_root/generators/java_templates/constant_definition.tmpl", | 
 |       "$generator_root/generators/java_templates/constants.java.tmpl", | 
 |       "$generator_root/generators/java_templates/enum.java.tmpl", | 
 |       "$generator_root/generators/java_templates/enum_definition.tmpl", | 
 |       "$generator_root/generators/java_templates/header.java.tmpl", | 
 |       "$generator_root/generators/java_templates/interface.java.tmpl", | 
 |       "$generator_root/generators/java_templates/interface_definition.tmpl", | 
 |       "$generator_root/generators/java_templates/interface_internal.java.tmpl", | 
 |       "$generator_root/generators/java_templates/struct.java.tmpl", | 
 |       "$generator_root/generators/java_templates/struct_definition.tmpl", | 
 |       "$generator_root/generators/js_templates/enum_definition.tmpl", | 
 |       "$generator_root/generators/js_templates/interface_definition.tmpl", | 
 |       "$generator_root/generators/js_templates/module.amd.tmpl", | 
 |       "$generator_root/generators/js_templates/module_definition.tmpl", | 
 |       "$generator_root/generators/js_templates/struct_definition.tmpl", | 
 |       "$generator_root/generators/python_templates/module.py.tmpl", | 
 |       "$generator_root/generators/python_templates/module_macros.tmpl", | 
 |       "$generator_root/generators/mojom_cpp_generator.py", | 
 |       "$generator_root/generators/mojom_dart_generator.py", | 
 |       "$generator_root/generators/mojom_go_generator.py", | 
 |       "$generator_root/generators/mojom_js_generator.py", | 
 |       "$generator_root/generators/mojom_java_generator.py", | 
 |       "$generator_root/generators/mojom_python_generator.py", | 
 |       "$generator_root/pylib/mojom/__init__.py", | 
 |       "$generator_root/pylib/mojom/error.py", | 
 |       "$generator_root/pylib/mojom/generate/__init__.py", | 
 |       "$generator_root/pylib/mojom/generate/constant_resolver.py", | 
 |       "$generator_root/pylib/mojom/generate/data.py", | 
 |       "$generator_root/pylib/mojom/generate/generator.py", | 
 |       "$generator_root/pylib/mojom/generate/module.py", | 
 |       "$generator_root/pylib/mojom/generate/pack.py", | 
 |       "$generator_root/pylib/mojom/generate/template_expander.py", | 
 |       "$generator_root/pylib/mojom/parse/__init__.py", | 
 |       "$generator_root/pylib/mojom/parse/ast.py", | 
 |       "$generator_root/pylib/mojom/parse/lexer.py", | 
 |       "$generator_root/pylib/mojom/parse/parser.py", | 
 |       "$generator_root/pylib/mojom/parse/translate.py", | 
 |     ] | 
 |     generator_cpp_outputs = [ | 
 |       "{{source_gen_dir}}/{{source_name_part}}.mojom.cc", | 
 |       "{{source_gen_dir}}/{{source_name_part}}.mojom.h", | 
 |       "{{source_gen_dir}}/{{source_name_part}}.mojom-internal.h", | 
 |     ] | 
 |     generator_js_outputs = | 
 |         [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ] | 
 |     generator_dart_outputs = | 
 |         [ "{{source_gen_dir}}/{{source_name_part}}.mojom.dart" ] | 
 |     generator_go_outputs = [ "${root_gen_dir}/go/src/{{source_dir}}/{{source_name_part}}/{{source_name_part}}.mojom.go" ] | 
 |     generator_python_outputs = | 
 |         [ "{{source_gen_dir}}/{{source_name_part}}_mojom.py" ] | 
 |     generator_java_outputs = | 
 |         [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ] | 
 |   } | 
 |   generator_dart_zip_output = "$target_out_dir/$target_name.dartzip" | 
 |   generator_python_zip_output = "$target_out_dir/$target_name.pyzip" | 
 |  | 
 |   rebased_mojo_sdk_public_deps = [] | 
 |   if (defined(invoker.mojo_sdk_public_deps)) { | 
 |     foreach(sdk_dep, invoker.mojo_sdk_public_deps) { | 
 |       # Check that the SDK dep was not mistakenly given as an absolute path. | 
 |       assert(get_path_info(sdk_dep, "abspath") != sdk_dep) | 
 |       rebased_mojo_sdk_public_deps += [ rebase_path(sdk_dep, ".", mojo_root) ] | 
 |     } | 
 |   } | 
 |  | 
 |   rebased_mojo_sdk_deps = [] | 
 |   if (defined(invoker.mojo_sdk_deps)) { | 
 |     foreach(sdk_dep, invoker.mojo_sdk_deps) { | 
 |       # Check that the SDK dep was not mistakenly given as an absolute path. | 
 |       assert(get_path_info(sdk_dep, "abspath") != sdk_dep) | 
 |       rebased_mojo_sdk_deps += [ rebase_path(sdk_dep, ".", mojo_root) ] | 
 |     } | 
 |   } | 
 |  | 
 |   if (defined(invoker.visibility)) { | 
 |     # Need to save this because the the target_name is overwritten inside the | 
 |     # action to be that of the action itself. Only define this in the case the | 
 |     # var is used to avoid unused var error. | 
 |     target_visibility = [ ":$target_name" ] | 
 |   } | 
 |  | 
 |   if (defined(invoker.sources)) { | 
 |     generator_target_name = target_name + "__generator" | 
 |     action_foreach(generator_target_name) { | 
 |       if (defined(invoker.visibility)) { | 
 |         visibility = target_visibility + invoker.visibility | 
 |       } | 
 |       script = generator_script | 
 |       inputs = generator_sources | 
 |       sources = invoker.sources | 
 |       outputs = generator_cpp_outputs + generator_dart_outputs + | 
 |                 generator_go_outputs + generator_java_outputs + | 
 |                 generator_js_outputs + generator_python_outputs | 
 |       args = [ | 
 |         "{{source}}", | 
 |         "--use_bundled_pylibs", | 
 |         "-d", | 
 |         rebase_path("//", root_build_dir), | 
 |         "-I", | 
 |         rebase_path("//", root_build_dir), | 
 |         "-I", | 
 |         rebase_path(mojo_root, root_build_dir), | 
 |         "-o", | 
 |         rebase_path(root_gen_dir), | 
 |       ] | 
 |  | 
 |       if (defined(invoker.import_dirs)) { | 
 |         foreach(import_dir, invoker.import_dirs) { | 
 |           args += [ | 
 |             "-I", | 
 |             rebase_path(import_dir, root_build_dir), | 
 |           ] | 
 |         } | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   source_set(target_name) { | 
 |     if (defined(invoker.visibility)) { | 
 |       visibility = invoker.visibility | 
 |     } | 
 |     if (defined(invoker.testonly)) { | 
 |       testonly = invoker.testonly | 
 |     } | 
 |     if (defined(invoker.sources)) { | 
 |       sources = process_file_template(invoker.sources, generator_cpp_outputs) | 
 |       data = process_file_template(invoker.sources, generator_js_outputs) | 
 |     } | 
 |  | 
 |     public_configs = | 
 |         rebase_path([ "mojo/public/build/config:mojo_sdk" ], ".", mojo_root) | 
 |  | 
 |     public_deps = rebase_path([ "mojo/public/cpp/bindings" ], ".", mojo_root) | 
 |     public_deps += rebased_mojo_sdk_public_deps | 
 |     if (defined(invoker.public_deps)) { | 
 |       public_deps += invoker.public_deps | 
 |     } | 
 |  | 
 |     deps = [] | 
 |     if (defined(invoker.sources)) { | 
 |       deps += [ ":$generator_target_name" ] | 
 |     } | 
 |     deps += rebased_mojo_sdk_deps | 
 |     if (defined(invoker.deps)) { | 
 |       deps += invoker.deps | 
 |     } | 
 |     data_deps = [ | 
 |       ":${target_name}_python", | 
 |       ":${target_name}_dart", | 
 |     ] | 
 |     if (defined(invoker.mojo_sdk_deps)) { | 
 |       foreach(sdk_dep, invoker.mojo_sdk_deps) { | 
 |         # Check that the SDK dep was not mistakenly given as an absolute path. | 
 |         assert(get_path_info(sdk_dep, "abspath") != sdk_dep) | 
 |         deps += [ rebase_path(sdk_dep, ".", mojo_root) ] | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   all_deps = rebased_mojo_sdk_deps + rebased_mojo_sdk_public_deps | 
 |   if (defined(invoker.deps)) { | 
 |     all_deps += invoker.deps | 
 |   } | 
 |   if (defined(invoker.public_deps)) { | 
 |     all_deps += invoker.public_deps | 
 |   } | 
 |  | 
 |   group("${target_name}__is_mojom") { | 
 |   } | 
 |  | 
 |   # Explicitly ensure that all dependencies (invoker.deps and | 
 |   # invoker.public_deps) are mojom targets themselves. | 
 |   group("${target_name}__check_deps_are_all_mojom") { | 
 |     deps = [] | 
 |     foreach(d, all_deps) { | 
 |       name = get_label_info(d, "label_no_toolchain") | 
 |       toolchain = get_label_info(d, "toolchain") | 
 |       deps += [ "${name}__is_mojom(${toolchain})" ] | 
 |     } | 
 |   } | 
 |  | 
 |   action("${target_name}_python") { | 
 |     script = rebase_path("mojo/public/tools/gn/zip.py", ".", mojo_root) | 
 |  | 
 |     if (defined(invoker.sources)) { | 
 |       inputs = process_file_template(invoker.sources, generator_python_outputs) | 
 |     } | 
 |  | 
 |     deps = [] | 
 |     zip_inputs = [] | 
 |  | 
 |     foreach(d, all_deps) { | 
 |       # Resolve the name, so that a target //mojo/something becomes | 
 |       # //mojo/something:something and we can append "_python" to get the python | 
 |       # dependency name. | 
 |       full_name = get_label_info(d, "label_no_toolchain") | 
 |       dep_name = get_label_info(d, "name") | 
 |       dep_target_out_dir = get_label_info(d, "target_out_dir") | 
 |       deps += [ "${full_name}_python" ] | 
 |       zip_inputs += [ "$dep_target_out_dir/$dep_name.pyzip" ] | 
 |     } | 
 |  | 
 |     output = generator_python_zip_output | 
 |     outputs = [ | 
 |       output, | 
 |     ] | 
 |  | 
 |     rebase_base_dir = rebase_path(target_gen_dir, root_build_dir) | 
 |     if (defined(invoker.sources)) { | 
 |       rebase_inputs = rebase_path(inputs, root_build_dir) | 
 |     } | 
 |     rebase_zip_inputs = rebase_path(zip_inputs, root_build_dir) | 
 |     rebase_output = rebase_path(output, root_build_dir) | 
 |     args = [ | 
 |       "--base-dir=$rebase_base_dir", | 
 |       "--zip-inputs=$rebase_zip_inputs", | 
 |       "--output=$rebase_output", | 
 |     ] | 
 |     if (defined(invoker.sources)) { | 
 |       args += [ "--inputs=$rebase_inputs" ] | 
 |     } | 
 |   } | 
 |  | 
 |   action("${target_name}_dart") { | 
 |     script = rebase_path("mojo/public/tools/gn/zip.py", ".", mojo_root) | 
 |  | 
 |     if (defined(invoker.sources)) { | 
 |       inputs = process_file_template(invoker.sources, generator_dart_outputs) | 
 |     } | 
 |  | 
 |     deps = [] | 
 |     zip_inputs = [] | 
 |  | 
 |     foreach(d, all_deps) { | 
 |       # Resolve the name, so that a target //mojo/something becomes | 
 |       # //mojo/something:something and we can append "_dart" to get the dart | 
 |       # dependency name. | 
 |       full_name = get_label_info(d, "label_no_toolchain") | 
 |       dep_name = get_label_info(d, "name") | 
 |       dep_target_out_dir = get_label_info(d, "target_out_dir") | 
 |       deps += [ "${full_name}_dart" ] | 
 |       zip_inputs += [ "$dep_target_out_dir/$dep_name.dartzip" ] | 
 |     } | 
 |  | 
 |     output = generator_dart_zip_output | 
 |     outputs = [ | 
 |       output, | 
 |     ] | 
 |  | 
 |     rebase_import_from = | 
 |         rebase_path("$root_build_dir/gen/dart-gen", root_build_dir) | 
 |     if (defined(invoker.sources)) { | 
 |       rebase_inputs = rebase_path(inputs, root_build_dir) | 
 |     } | 
 |     rebase_zip_inputs = rebase_path(zip_inputs, root_build_dir) | 
 |     rebase_output = rebase_path(output, root_build_dir) | 
 |     args = [ | 
 |       "--base-dir=$rebase_import_from", | 
 |       "--zip-inputs=$rebase_zip_inputs", | 
 |       "--output=$rebase_output", | 
 |     ] | 
 |     if (defined(invoker.sources)) { | 
 |       args += [ "--link-inputs=$rebase_inputs" ] | 
 |     } | 
 |   } | 
 |  | 
 |   if (is_android) { | 
 |     import("//build/config/android/rules.gni") | 
 |  | 
 |     java_target_name = target_name + "_java" | 
 |     android_library(java_target_name) { | 
 |       deps = rebase_path([ | 
 |                            "mojo/public/java:bindings", | 
 |                            "mojo/public/java:system", | 
 |                          ], | 
 |                          ".", | 
 |                          mojo_root) | 
 |  | 
 |       foreach(d, all_deps) { | 
 |         # Resolve the name, so that a target //mojo/something becomes | 
 |         # //mojo/something:something and we can append "_java" to get the java | 
 |         # dependency name. | 
 |         full_name = get_label_info(d, "label_no_toolchain") | 
 |         deps += [ "${full_name}_java" ] | 
 |       } | 
 |  | 
 |       if (defined(invoker.sources)) { | 
 |         srcjars = process_file_template(invoker.sources, generator_java_outputs) | 
 |       } | 
 |     } | 
 |   } | 
 | } |