# 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("//build/config/python.gni")
import("//build/toolchain/toolchain.gni")
import("//third_party/blink/renderer/config.gni")

if (is_mac) {
  import("//build/config/mac/mac_sdk.gni")
}

# All paths in this file should be absolute so targets in any directory can use
# them without worrying about the current directory.
_scripts_dir = "//third_party/blink/renderer/build/scripts"

scripts_for_json5_files = [
  # jinja2/__init__.py contains version string, so sufficient as
  # dependency for whole jinja2 package
  "//third_party/jinja2/__init__.py",
  "//third_party/markupsafe/__init__.py",  # jinja2 dep
  "$_scripts_dir/blinkbuild/name_style_converter.py",
  "$_scripts_dir/hasher.py",
  "$_scripts_dir/json5_generator.py",
  "$_scripts_dir/license.py",
  "$_scripts_dir/name_utilities.py",
  "$_scripts_dir/template_expander.py",
  "$_scripts_dir/templates/macros.tmpl",
  "$_scripts_dir/core/css/field_alias_expander.py",
  "$_scripts_dir/core/css/properties/templates/style_builder_functions.tmpl",
]

css_properties_files =
    scripts_for_json5_files + [ "$_scripts_dir/core/css/css_properties.py" ]

make_event_factory_files = scripts_for_json5_files + [
                             "$_scripts_dir/make_event_factory.py",
                             "$_scripts_dir/templates/event_factory.cc.tmpl",
                           ]

make_names_files = scripts_for_json5_files + [
                     "$_scripts_dir/make_names.py",
                     "$_scripts_dir/templates/make_names.cc.tmpl",
                     "$_scripts_dir/templates/make_names.h.tmpl",
                   ]

make_qualified_names_files =
    scripts_for_json5_files + [
      "$_scripts_dir/make_qualified_names.py",
      "$_scripts_dir/templates/make_qualified_names.cc.tmpl",
      "$_scripts_dir/templates/make_qualified_names.h.tmpl",
    ]

make_element_factory_files =
    make_qualified_names_files + [
      "$_scripts_dir/make_element_factory.py",
      "$_scripts_dir/templates/element_factory.cc.tmpl",
      "$_scripts_dir/templates/element_factory.h.tmpl",
    ]

make_element_type_helpers_files =
    make_qualified_names_files + [
      "$_scripts_dir/make_element_type_helpers.py",
      "$_scripts_dir/templates/element_type_helpers.cc.tmpl",
      "$_scripts_dir/templates/element_type_helpers.h.tmpl",
    ]

make_trie_helpers_files =
    scripts_for_json5_files + [ "$_scripts_dir/trie_builder.py" ]

# The executables are relative to the build directory. Don't rebase it because
# on Posix we want to run the system one on the path.
if (host_os == "win") {
  gperf_exe = rebase_path("//third_party/gperf/bin/gperf.exe", root_build_dir)
} else if (host_os == "mac") {
  gperf_exe = mac_bin_path + "gperf"
} else {
  gperf_exe = "gperf"
}

# Templates --------------------------------------------------------------------

_blink_gen_dir = "$root_gen_dir/third_party/blink/renderer"

make_core_generated_deps = [
  "//third_party/blink/renderer/core:core_event_interfaces",
  "//third_party/blink/renderer/core:generated_testing_idls",
]

# A wrapper for python scripts. This adds the following paths to PYTHONPATH,
# then run invoker.script.
#  - //third_party/blink/renderer/build/scripts
#  - //third_party
template("blink_python_runner") {
  action(target_name) {
    script = "$_scripts_dir/run_with_pythonpath.py"
    sources = [ invoker.script ]
    if (defined(invoker.sources)) {
      sources += invoker.sources
    }
    if (defined(invoker.inputs)) {
      inputs = invoker.inputs
    }
    if (defined(invoker.data)) {
      data = invoker.data
    }
    outputs = invoker.outputs
    args = [
             "-I",
             rebase_path(_scripts_dir, root_build_dir),
             "-I",
             rebase_path("//third_party", root_build_dir),
             "-I",
             rebase_path("//tools", root_build_dir),
             rebase_path(invoker.script, root_build_dir),
           ] + invoker.args
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
    if (defined(invoker.data_deps)) {
      data_deps = invoker.data_deps
    }
    forward_variables_from(invoker, [ "visibility" ])
  }
}

# TODO(crbug.com/732657): Remove this once everything that uses this switches over to
# the 'code_generator' template instead.
# Template to run most of scripts that process "*.json5" files.
#   script: script to run.
#   in_files: input ".json5" files to pass to the script
#   other_inputs: (optional) other input files the script depends on
#                 defaults to "scripts_for_json5_files" (if specified, we assume
#                 that the contents of "scripts_for_json5_files" are included in
#                 this list).
#   outputs: expected results. Note that the directory of the 0th item in this
#            list will be taken to be the output path.
#   other_args: (optional) other arguments to pass to the script.
#   deps [optional]:
#     Depenendencies. If unspecified defaults to make_core_generated_deps.
template("process_json5_files") {
  blink_python_runner(target_name) {
    script = invoker.script

    inputs = invoker.in_files
    if (defined(invoker.other_inputs)) {
      inputs += invoker.other_inputs
    } else {
      inputs += scripts_for_json5_files
    }
    outputs = invoker.outputs

    # Extract the directory to write files to.
    output_dir = get_path_info(outputs[0], "dir")

    args = rebase_path(invoker.in_files, root_build_dir) + [
             "--output_dir",
             rebase_path(output_dir, root_build_dir),
           ]
    if (defined(invoker.other_args)) {
      args += invoker.other_args
    }

    if (defined(invoker.deps)) {
      deps = invoker.deps
    } else {
      deps = make_core_generated_deps
    }
    forward_variables_from(invoker, [ "visibility" ])
  }
}

# Template to run code generators in build/scripts/.
#   script: the path to the script to run.
#   json_inputs: ".json5" files to pass to the generator.
#   templates: ".tmpl" files that this generator depends on.
#   other_inputs: (optional) other input files the generator depends on
#                 in addition to "scripts_for_json5_files"
#   outputs: expected results. Note that the directory of the 0th item in this
#            list will be taken to be the output path.
#   other_args: (optional) other arguments to pass to the script.
#   deps [optional]:
#     Depenendencies. If unspecified defaults to make_core_generated_deps.
template("code_generator") {
  blink_python_runner(target_name) {
    script = invoker.script
    inputs = invoker.json_inputs + invoker.templates + scripts_for_json5_files
    if (defined(invoker.other_inputs)) {
      inputs += invoker.other_inputs
    }
    outputs = invoker.outputs

    # Extract the directory to write files to.
    output_dir = get_path_info(outputs[0], "dir")

    args = rebase_path(invoker.json_inputs, root_build_dir) + [
             "--output_dir",
             rebase_path(output_dir, root_build_dir),
           ]
    if (defined(invoker.other_args)) {
      args += invoker.other_args
    }

    if (defined(invoker.deps)) {
      deps = invoker.deps
    } else {
      deps = make_core_generated_deps
    }
    forward_variables_from(invoker, [ "visibility" ])
  }
}

# Template for scripts using css_properties.py. This is a special case of
# process_json5_files.
#   outputs: expected results
template("css_properties") {
  process_json5_files(target_name) {
    script = invoker.script
    in_files = [
      "css/css_properties.json5",
      "css/computed_style_field_aliases.json5",
      "../platform/runtime_enabled_features.json5",
    ]
    if (defined(invoker.in_files)) {
      in_files += invoker.in_files
    }
    other_inputs = css_properties_files
    if (defined(invoker.other_inputs)) {
      other_inputs += invoker.other_inputs
    }
    other_args = [
      "--gperf",
      gperf_exe,
    ]
    outputs = invoker.outputs
  }
}

# Template to run the make_names script. This is a special case of
# process_json5_files.
#   in_files: input files to pass to the script
#   output_dir: output directory
#   deps [optional]:
#     Dependencies. See process_json5_files for definition.
template("make_names") {
  output_dir = invoker.output_dir
  outputs = process_file_template(invoker.in_files,
                                  [
                                    "$output_dir/{{source_name_part}}.cc",
                                    "$output_dir/{{source_name_part}}.h",
                                  ])
  process_json5_files(target_name) {
    script = "//third_party/blink/renderer/build/scripts/make_names.py"
    other_inputs = make_names_files
    forward_variables_from(invoker,
                           [
                             "deps",
                             "in_files",
                             "public_deps",
                             "visibility",
                           ])
  }
}

# Template to run the make_qualified_names script. This is a special case of
# process_json5_files.
#   in_files: list of input ".json5" files to process.
#   outputs: list of output files
template("make_qualified_names") {
  process_json5_files(target_name) {
    script =
        "//third_party/blink/renderer/build/scripts/make_qualified_names.py"
    in_files = invoker.in_files
    other_inputs = make_qualified_names_files
    outputs = invoker.outputs
  }
}

# Calls the make_event_factory script. This is a special case of
# process_json5_files.
#   in_files: list of input ".json5" files to process.
#   outputs: list of output files
#   deps [optional]
#     Dependencies. See process_json5_files for definition.
template("make_event_factory") {
  process_json5_files(target_name) {
    script = "//third_party/blink/renderer/build/scripts/make_event_factory.py"
    other_inputs = make_event_factory_files
    forward_variables_from(invoker,
                           [
                             "deps",
                             "in_files",
                             "outputs",
                             "visibility",
                           ])
  }
}
