# 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.

# TODO(brettw) this should maybe be moved to tools/json_schema_compiler/ where
# the script is. Currently, we keep it in the build directory with the gyp
# version to make it easier to find.
#
# Or, considering the fact that it references the chrome/extensions directory,
# it should possibly be moved there.

_api_gen_dir = "//tools/json_schema_compiler"
_api_gen = "$_api_gen_dir/compiler.py"
_impl_dir = "chrome/browser/extensions/api"

_python_files = [
  "$_api_gen_dir/cc_generator.py",
  "$_api_gen_dir/code.py",
  "$_api_gen_dir/compiler.py",
  "$_api_gen_dir/cpp_bundle_generator.py",
  "$_api_gen_dir/cpp_type_generator.py",
  "$_api_gen_dir/cpp_util.py",
  "$_api_gen_dir/h_generator.py",
  "$_api_gen_dir/idl_schema.py",
  "$_api_gen_dir/json_schema.py",
  "$_api_gen_dir/model.py",
  "$_api_gen_dir/util_cc_helper.py",
]

# Runs the schema compiler over a list of sources.
#
# Parameters:
#   sources
#       The .json and .idl files to compile.
#
#   root_namespace
#       The C++ namespace that all generated files go under.
#
#   deps, visibility (optional)
template("json_schema_compile") {
  assert(defined(invoker.sources), "Need sources for $target_name")
  assert(defined(invoker.root_namespace),
         "Need root_namespace defined for $target_name")

  action_name = "${target_name}_action"
  source_set_name = target_name

  action_foreach(action_name) {
    visibility = ":$source_set_name"
    script = _api_gen

    source_prereqs = _python_files
    sources = invoker.sources

    # TODO(GYP) We should probably be using {{source_gen_dir}} instead of
    # $target_gen_dir but support for this string isn't pushed out in GN
    # binaries yet. Replace this when it is.
    outputs = [
      "$target_gen_dir/{{source_name_part}}.cc",
      "$target_gen_dir/{{source_name_part}}.h",
    ]

    args = [
      "--root", rebase_path("//", root_build_dir),
      "--destdir", rebase_path(root_gen_dir, root_build_dir),
      "--namespace", invoker.root_namespace,
      "--generator=cpp",
      "--impl-dir", _impl_dir,
      "{{source}}",
    ]
  }

  source_set(source_set_name) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    sources = get_target_outputs(":$action_name")

    deps = [ ":$action_name" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}

# Runs the schema bundler.
#
# Parameters:
#   sources
#       The .json and .idl files to bundle.
#
#   root_namespace
#       The C++ namespace that all generated files go under.
#
#   deps, visibility (optional)
template("json_schema_bundle") {
  assert(defined(invoker.sources), "Need sources for $target_name")
  assert(defined(invoker.root_namespace),
         "Need root_namespace defined for $target_name")

  action_name = "${target_name}_action"
  source_set_name = target_name

  action(action_name) {
    visibility = ":$source_set_name"
    script = _api_gen

    source_prereqs = _python_files
    source_prereqs += invoker.sources

    outputs = [
      "$target_gen_dir/generated_api.h",
      "$target_gen_dir/generated_api.cc",
      "$target_gen_dir/generated_schemas.h",
      "$target_gen_dir/generated_schemas.cc",
    ]

    args = [
      "--root", rebase_path("//", root_build_dir),
      "--destdir", rebase_path(root_gen_dir, root_build_dir),
      "--namespace", invoker.root_namespace,
      "--generator=cpp-bundle",
      "--impl-dir", _impl_dir,
    ] + rebase_path(invoker.sources, root_build_dir)
  }

  source_set(source_set_name) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    sources = get_target_outputs(":$action_name")

    deps = [ ":$action_name" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}