chromium/third_party/blink/renderer/build/scripts/scripts.gni

# Copyright 2014 The Chromium Authors
# 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_ios) {
  import("//build/config/ios/ios_sdk.gni")
} else if (host_os == "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
  "//third_party/pyjson5/src/json5/__init__.py",
  "$_scripts_dir/blinkbuild/name_style_converter.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",
                         "$_scripts_dir/make_origin_trials.py",
                         "$_scripts_dir/make_runtime_features_utilities.py",
                         "$_scripts_dir/make_runtime_features.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/aria_properties.py",
      "$_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 (is_ios) {
  gperf_exe = ios_bin_path + "gperf"
} else if (host_os == "mac") {
  # TODO(thakis): This should probably run in the host toolchain and check
  # is_mac instead of checking host_os.
  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
#  - //third_party/pyjson5/src
#  - //tools
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("//third_party/pyjson5/src", 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",
                           ])
  }
}