# 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.
#
# bundle_name [required if bundle or bundle_registrations]:
#     A string to prepend to generated bundle class names, so that multiple
#     bundle rules can be used without conflicting.  Only used with one of
#     the cpp-bundle generators.
#
# 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.
#
# uncompiled_bundle_schema_sources [optional, only used when bundle = true]
#   A list of schema files which should not be compiled nor registered, but
#   should still be processed for the schema generation.
#
# configs [optional]
#   Extra configs to apply to the compile step.
#
# 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_bundle_generator.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) {
    assert(defined(invoker.bundle_name),
           "\"bundle_name\" must be defined for bundles")

    uncompiled_sources = []
    if (defined(invoker.uncompiled_sources)) {
      uncompiled_sources = invoker.uncompiled_sources
    }

    uncompiled_bundle_schema_sources = []
    if (defined(invoker.uncompiled_bundle_schema_sources)) {
      uncompiled_bundle_schema_sources =
          invoker.uncompiled_bundle_schema_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",
               "--bundle-name=" + invoker.bundle_name,
               "--generator=cpp-bundle-schema",
               "--include-rules=$schema_include_rules",
             ] + rebase_path(invoker.sources, root_build_dir) +
             rebase_path(uncompiled_sources, root_build_dir) +
             rebase_path(uncompiled_bundle_schema_sources, root_build_dir)
    }
  }

  if (bundle_registration) {
    assert(defined(invoker.bundle_name),
           "\"bundle_name\" must be defined for bundle registrations")

    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",
               "--bundle-name=" + invoker.bundle_name,
               "--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 (defined(invoker.configs)) {
    lib_extra_configs += invoker.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
  }

  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
    }
  }
}
