|  | # 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. | 
|  |  | 
|  | # Defines a static library corresponding to the output of schema compiler tools | 
|  | # over a set of extensions API schemas (IDL or JSON format.) The library target | 
|  | # has implicit hard dependencies on all schema files listed by the invoker and | 
|  | # is itself a hard dependency. | 
|  | # | 
|  | # Invocations of this template may use the following variables: | 
|  | # | 
|  | # sources [required] A list of schema files to be compiled. | 
|  | # | 
|  | # root_namespace [required] | 
|  | #     A Python string substituion pattern used to generate the C++ | 
|  | #     namespace for each API. Use %(namespace)s to replace with the API | 
|  | #     namespace, like "toplevel::%(namespace)s_api". | 
|  | # | 
|  | # schema_include_rules [optional] | 
|  | #     A list of paths to include when searching for referenced objects, | 
|  | #     with the namespace separated by a :. | 
|  | #     Example: | 
|  | #       [ '/foo/bar:Foo::Bar::%(namespace)s' ] | 
|  | # | 
|  | # schemas [optional, default = false] | 
|  | #   Boolean indicating if the schema files should be generated. | 
|  | # | 
|  | # bundle [optional, default = false] | 
|  | #   Boolean indicating if the schema bundle files should be generated. | 
|  | # | 
|  | # bundle_registration [optional, default = false] | 
|  | #   Boolean indicating if the API registration bundle files should be generated. | 
|  | # | 
|  | # impl_dir [required if bundle_registration = true, otherwise unused] | 
|  | #   The path containing C++ implementations of API functions. This path is | 
|  | #   used as the root path when looking for {schema}/{schema}_api.h headers | 
|  | #   when generating API registration bundles. Such headers, if found, are | 
|  | #   automatically included by the generated code. | 
|  | # | 
|  | # uncompiled_sources [optional, only used when bundle = true or | 
|  | #     bundle_registration = true] | 
|  | #   A list of schema files which should not be compiled, but which should still | 
|  | #   be processed for API bundle generation. | 
|  | # | 
|  | # deps [optional] | 
|  | #   If any deps are specified they will be inherited by the static library | 
|  | #   target. | 
|  | # | 
|  | # generate_static_library [optional, defaults to false] | 
|  | #   Produces a static library instead of a source_set. | 
|  | # | 
|  | # The generated library target also inherits the visibility and output_name | 
|  | # of its invoker. | 
|  |  | 
|  | template("json_schema_api") { | 
|  | assert(defined(invoker.sources), | 
|  | "\"sources\" must be defined for the $target_name template.") | 
|  | assert(defined(invoker.root_namespace), | 
|  | "\"root_namespace\" must be defined for the $target_name template.") | 
|  |  | 
|  | schemas = defined(invoker.schemas) && invoker.schemas | 
|  | bundle = defined(invoker.bundle) && invoker.bundle | 
|  | bundle_registration = | 
|  | defined(invoker.bundle_registration) && invoker.bundle_registration | 
|  |  | 
|  | schema_include_rules = "" | 
|  | if (defined(invoker.schema_include_rules)) { | 
|  | schema_include_rules = invoker.schema_include_rules | 
|  | } | 
|  |  | 
|  | # Keep a copy of the target_name here since it will be trampled | 
|  | # in nested targets. | 
|  | target_visibility = [ ":$target_name" ] | 
|  |  | 
|  | generated_config_name = target_name + "_generated_config" | 
|  | config(generated_config_name) { | 
|  | include_dirs = [ root_gen_dir ] | 
|  | visibility = target_visibility | 
|  | } | 
|  |  | 
|  | root_namespace = invoker.root_namespace | 
|  |  | 
|  | compiler_root = "//tools/json_schema_compiler" | 
|  | compiler_script = "$compiler_root/compiler.py" | 
|  | compiler_sources = [ | 
|  | "$compiler_root/cc_generator.py", | 
|  | "$compiler_root/code.py", | 
|  | "$compiler_root/compiler.py", | 
|  | "$compiler_root/cpp_generator.py", | 
|  | "$compiler_root/cpp_type_generator.py", | 
|  | "$compiler_root/cpp_util.py", | 
|  | "$compiler_root/h_generator.py", | 
|  | "$compiler_root/idl_schema.py", | 
|  | "$compiler_root/model.py", | 
|  | "$compiler_root/util_cc_helper.py", | 
|  | ] | 
|  |  | 
|  | if (schemas) { | 
|  | schema_generator_name = target_name + "_schema_generator" | 
|  | action_foreach(schema_generator_name) { | 
|  | script = compiler_script | 
|  | sources = invoker.sources | 
|  | inputs = compiler_sources | 
|  | outputs = [ | 
|  | "$target_gen_dir/{{source_name_part}}.cc", | 
|  | "$target_gen_dir/{{source_name_part}}.h", | 
|  | ] | 
|  | args = [ | 
|  | "{{source}}", | 
|  | "--root=" + rebase_path("//", root_build_dir), | 
|  | "--destdir=" + rebase_path(root_gen_dir, root_build_dir), | 
|  | "--namespace=$root_namespace", | 
|  | "--generator=cpp", | 
|  | "--include-rules=$schema_include_rules", | 
|  | ] | 
|  |  | 
|  | if (defined(invoker.visibility)) { | 
|  | # If visibility is restricted, add our own target to it. | 
|  | visibility = invoker.visibility + target_visibility | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if (bundle) { | 
|  | uncompiled_sources = [] | 
|  | if (defined(invoker.uncompiled_sources)) { | 
|  | uncompiled_sources = invoker.uncompiled_sources | 
|  | } | 
|  |  | 
|  | bundle_generator_schema_name = target_name + "_bundle_generator_schema" | 
|  | action(bundle_generator_schema_name) { | 
|  | script = compiler_script | 
|  | inputs = compiler_sources + invoker.sources + uncompiled_sources | 
|  | outputs = [ | 
|  | "$target_gen_dir/generated_schemas.cc", | 
|  | "$target_gen_dir/generated_schemas.h", | 
|  | ] | 
|  | args = [ | 
|  | "--root=" + rebase_path("//", root_build_dir), | 
|  | "--destdir=" + rebase_path(root_gen_dir, root_build_dir), | 
|  | "--namespace=$root_namespace", | 
|  | "--generator=cpp-bundle-schema", | 
|  | "--include-rules=$schema_include_rules", | 
|  | ] + rebase_path(invoker.sources, root_build_dir) + | 
|  | rebase_path(uncompiled_sources, root_build_dir) | 
|  | } | 
|  | } | 
|  |  | 
|  | if (bundle_registration) { | 
|  | uncompiled_sources = [] | 
|  | if (defined(invoker.uncompiled_sources)) { | 
|  | uncompiled_sources = invoker.uncompiled_sources | 
|  | } | 
|  |  | 
|  | assert(defined(invoker.impl_dir), | 
|  | "\"impl_dir\" must be defined for the $target_name template.") | 
|  |  | 
|  | # Child directory inside the generated file tree. | 
|  | gen_child_dir = rebase_path(invoker.impl_dir, "//") | 
|  |  | 
|  | bundle_generator_registration_name = | 
|  | target_name + "_bundle_generator_registration" | 
|  | action(bundle_generator_registration_name) { | 
|  | script = compiler_script | 
|  | inputs = compiler_sources + invoker.sources + uncompiled_sources | 
|  | outputs = [ | 
|  | "$root_gen_dir/$gen_child_dir/generated_api_registration.cc", | 
|  | "$root_gen_dir/$gen_child_dir/generated_api_registration.h", | 
|  | ] | 
|  | args = [ | 
|  | "--root=" + rebase_path("//", root_build_dir), | 
|  | "--destdir=" + rebase_path(root_gen_dir, root_build_dir), | 
|  | "--namespace=$root_namespace", | 
|  | "--generator=cpp-bundle-registration", | 
|  | "--impl-dir=$gen_child_dir", | 
|  | "--include-rules=$schema_include_rules", | 
|  | ] + rebase_path(invoker.sources, root_build_dir) + | 
|  | rebase_path(uncompiled_sources, root_build_dir) | 
|  | } | 
|  | } | 
|  |  | 
|  | # Compute the contents of the library/source set. | 
|  | lib_sources = invoker.sources | 
|  | lib_deps = [] | 
|  | lib_public_deps = [] | 
|  | lib_extra_configs = [] | 
|  |  | 
|  | if (schemas) { | 
|  | lib_sources += get_target_outputs(":$schema_generator_name") | 
|  | lib_public_deps += [ ":$schema_generator_name" ] | 
|  | lib_deps += [ "//tools/json_schema_compiler:generated_api_util" ] | 
|  | lib_extra_configs += [ "//build/config/compiler:no_size_t_to_int_warning" ] | 
|  | } | 
|  |  | 
|  | if (bundle) { | 
|  | lib_sources += get_target_outputs(":$bundle_generator_schema_name") | 
|  | lib_deps += [ ":$bundle_generator_schema_name" ] | 
|  | } | 
|  |  | 
|  | if (bundle_registration) { | 
|  | lib_sources += get_target_outputs(":$bundle_generator_registration_name") | 
|  | lib_deps += [ ":$bundle_generator_registration_name" ] | 
|  | } | 
|  |  | 
|  | if (defined(invoker.deps)) { | 
|  | lib_deps += invoker.deps | 
|  | } | 
|  |  | 
|  | # Generate either a static library or a source set. | 
|  | if (defined(invoker.generate_static_library) && | 
|  | invoker.generate_static_library) { | 
|  | static_library(target_name) { | 
|  | sources = lib_sources | 
|  | deps = lib_deps | 
|  | public_deps = lib_public_deps | 
|  | configs += lib_extra_configs | 
|  | public_configs = [ ":$generated_config_name" ] | 
|  |  | 
|  | if (defined(invoker.visibility)) { | 
|  | visibility = invoker.visibility | 
|  | } | 
|  | if (defined(invoker.output_name)) { | 
|  | output_name = invoker.output_name | 
|  | } | 
|  | } | 
|  | } else { | 
|  | source_set(target_name) { | 
|  | sources = lib_sources | 
|  | deps = lib_deps | 
|  | public_deps = lib_public_deps | 
|  | configs += lib_extra_configs | 
|  | public_configs = [ ":$generated_config_name" ] | 
|  |  | 
|  | if (defined(invoker.visibility)) { | 
|  | visibility = invoker.visibility | 
|  | } | 
|  | if (defined(invoker.output_name)) { | 
|  | output_name = invoker.output_name | 
|  | } | 
|  | } | 
|  | } | 
|  | } |