|  | # Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import("../executable_suffix.gni") | 
|  | import("prebuilt_dart_sdk.gni") | 
|  |  | 
|  | _is_fuchsia = defined(is_fuchsia_tree) && is_fuchsia_tree | 
|  |  | 
|  | if (_is_fuchsia) { | 
|  | import("//build/dart/dart.gni") | 
|  | } | 
|  |  | 
|  | # This file defines templates for running and compiling Dart code during | 
|  | # Dart's build. | 
|  | # | 
|  | # - prebuilt_dart_action() | 
|  | #   Runs Dart scripts using the downloaded prebuilt Dart SDK. This is the | 
|  | #   preferred method of running Dart code during the build as it is much | 
|  | #   faster than using dart_action() in debug and cross builds. | 
|  | #   However, prebuilt_dart_action() should *not* be used to generate snapshots. | 
|  | # | 
|  | # - dart_action() | 
|  | #   Runs Dart scripts using the binary built for runtime/bin:dart using the | 
|  | #   host toolchain. It should only be used when an artifact agreeing exactly | 
|  | #   with the version of the Dart VM being built must be produced, for example | 
|  | #   an App-JIT snapshot. This will be slow in Debug builds, and very slow in | 
|  | #   cross builds. | 
|  | # | 
|  | # - gen_snapshot_action() | 
|  | #   Runs the binary built for runtime/bin:gen_snapshot using the host | 
|  | #   toolchain. It should only be used when an artifact agreeing exactly | 
|  | #   with the version of the Dart VM being built must be produced. | 
|  |  | 
|  | # This assigns _dart_root the GN absolute path of the Dart repo. For example, | 
|  | # in a Dart checkout, this will be "//". In a client repo it might be | 
|  | # "//third_party/dart". | 
|  | _dart_root = get_path_info("../..", "abspath") | 
|  |  | 
|  | template("_compiled_action") { | 
|  | assert(defined(invoker.tool), "tool must be defined for $target_name") | 
|  | assert(defined(invoker.outputs), "outputs must be defined for $target_name") | 
|  | assert(defined(invoker.args), "args must be defined for $target_name") | 
|  |  | 
|  | action(target_name) { | 
|  | if (defined(invoker.visibility)) { | 
|  | visibility = invoker.visibility | 
|  | } | 
|  |  | 
|  | if (defined(invoker.testonly)) { | 
|  | testonly = invoker.testonly | 
|  | } | 
|  |  | 
|  | if (defined(invoker.pool)) { | 
|  | pool = invoker.pool | 
|  | } | 
|  |  | 
|  | script = "$_dart_root/build/gn_run_binary.py" | 
|  |  | 
|  | if (defined(invoker.inputs)) { | 
|  | inputs = invoker.inputs | 
|  | } else { | 
|  | inputs = [] | 
|  | } | 
|  | outputs = invoker.outputs | 
|  |  | 
|  | # Construct the host toolchain version of the tool. | 
|  | host_tool = invoker.tool + "($host_toolchain)" | 
|  |  | 
|  | # Get the path to the executable. Currently, this assumes that the tool | 
|  | # does not specify output_name so that the target name is the name to use. | 
|  | # If that's not the case, we'll need another argument to the script to | 
|  | # specify this, since we can't know what the output name is (it might be in | 
|  | # another file not processed yet). | 
|  | host_executable = get_label_info(host_tool, "root_out_dir") + "/" + | 
|  | get_label_info(host_tool, "name") + executable_suffix | 
|  |  | 
|  | # Add the executable itself as an input. | 
|  | inputs += [ host_executable ] | 
|  |  | 
|  | deps = [ host_tool ] | 
|  | if (defined(invoker.deps)) { | 
|  | deps += invoker.deps | 
|  | } | 
|  |  | 
|  | if (defined(invoker.depfile)) { | 
|  | depfile = invoker.depfile | 
|  | } | 
|  |  | 
|  | # The "compiled_action" argument to gn_run_binary.py indicates that | 
|  | # it will exit with a non-zero status when the target program does. | 
|  | args = [ | 
|  | "compiled_action", | 
|  | rebase_path(host_executable, root_build_dir), | 
|  | ] + invoker.args | 
|  | } | 
|  | } | 
|  |  | 
|  | template("_prebuilt_tool_action") { | 
|  | assert(defined(invoker.binary), | 
|  | "The path to where the prebuilt binary lives must be defined") | 
|  | assert(_is_fuchsia || prebuilt_dart_exe_works, | 
|  | "A pre built dart executable needs to be present") | 
|  |  | 
|  | vm_args = [] | 
|  | if (defined(invoker.vm_args)) { | 
|  | vm_args += invoker.vm_args | 
|  | } | 
|  |  | 
|  | action(target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "depfile", | 
|  | "deps", | 
|  | "outputs", | 
|  | "pool", | 
|  | "testonly", | 
|  | "visibility", | 
|  | ]) | 
|  | script = "$_dart_root/build/gn_run_binary.py" | 
|  |  | 
|  | inputs = [] | 
|  | if (defined(invoker.inputs)) { | 
|  | inputs += invoker.inputs | 
|  | } | 
|  |  | 
|  | if (defined(invoker.script)) { | 
|  | inputs += [ invoker.script ] | 
|  | } | 
|  | if (defined(invoker.packages)) { | 
|  | inputs += [ invoker.packages ] | 
|  | } | 
|  |  | 
|  | args = [ | 
|  | "compiled_action", | 
|  | rebase_path(invoker.binary), | 
|  | ] + vm_args | 
|  | if (defined(invoker.packages)) { | 
|  | args += [ "--packages=" + rebase_path(invoker.packages) ] | 
|  | } | 
|  | if (defined(invoker.dfe)) { | 
|  | args += [ "--dfe=" + rebase_path(invoker.dfe) ] | 
|  | } | 
|  | if (defined(invoker.script)) { | 
|  | args += [ rebase_path(invoker.script) ] | 
|  | } | 
|  | args += invoker.args | 
|  | } | 
|  | } | 
|  |  | 
|  | # A template for running Dart scripts during the build using the prebuilt Dart | 
|  | # SDK. This should *not* be used for generating snapshots. It uses the dart | 
|  | # binary from the prebuilt Dart SDK. | 
|  | # | 
|  | # Parameters: | 
|  | #  script: | 
|  | #    The un-rebased path to the Dart script. | 
|  | # | 
|  | # vm_args (optional): | 
|  | #    Arguments to pass to the Dart VM. | 
|  | # | 
|  | #  args (optional): | 
|  | #    The arguments to pass to the Dart script. | 
|  | # | 
|  | #  packages (optional): | 
|  | #    The un-rebased path to the .packages file. | 
|  | # | 
|  | #  Forwarded to action() with the usual meaning: | 
|  | #    depfile | 
|  | #    deps | 
|  | #    inputs | 
|  | #    outputs | 
|  | #    testonly | 
|  | #    visibility | 
|  | template("prebuilt_dart_action") { | 
|  | assert(defined(invoker.script), "script must be defined for $target_name") | 
|  | assert(defined(invoker.outputs), "outputs must be defined for $target_name") | 
|  | assert(defined(invoker.args), "args must be defined for $target_name") | 
|  | assert(!defined(invoker.sources), | 
|  | "prebuilt_dart_action doesn't take a sources arg. Use inputs instead.") | 
|  |  | 
|  | _prebuilt_tool_action(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  | if (_is_fuchsia) { | 
|  | binary = prebuilt_dart | 
|  | dfe = "$prebuilt_dart_sdk/bin/snapshots/kernel-service.dart.snapshot" | 
|  | } else { | 
|  | binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart$executable_suffix" | 
|  | dfe = "$_dart_root/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot" | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if (_is_fuchsia) { | 
|  | template("_prebuilt_gen_snapshot_action") { | 
|  | _prebuilt_tool_action(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  | binary = prebuilt_gen_snapshot | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | template("prebuilt_dart2js_action") { | 
|  | assert(defined(invoker.script), "script must be defined for $target_name") | 
|  | assert(defined(invoker.outputs), "outputs must be defined for $target_name") | 
|  | assert(defined(invoker.args), "args must be defined for $target_name") | 
|  |  | 
|  | _prebuilt_tool_action(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  |  | 
|  | # TODO(zra): On Fuchsia use a prebuilt dart2js, or a prebuilt Observatory. | 
|  | extension = "" | 
|  | if (is_win) { | 
|  | extension = ".bat" | 
|  | } | 
|  | binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart2js${extension}" | 
|  | } | 
|  | } | 
|  |  | 
|  | # This template runs the specified tool produced by the in-progress build. | 
|  | # | 
|  | # Parameters: | 
|  | #  tool: | 
|  | #    The target of the tool to run. | 
|  | # | 
|  | #  script (optional): | 
|  | #    The un-rebased path to the Dart script. | 
|  | # | 
|  | #  vm_args (optional): | 
|  | #    Arguments to pass to the Dart VM. | 
|  | # | 
|  | #  args (optional): | 
|  | #    The arguments to pass to the Dart script. | 
|  | # | 
|  | #  packages (optional): | 
|  | #    The un-rebased path to the .packages file. | 
|  | # | 
|  | #  Forwarded to action() with the usual meaning: | 
|  | #    depfile | 
|  | #    deps | 
|  | #    inputs | 
|  | #    outputs | 
|  | #    testonly | 
|  | #    visibility | 
|  | template("_built_tool_action") { | 
|  | assert(defined(invoker.tool), "tool must be defined for $target_name") | 
|  | assert(defined(invoker.outputs), "outputs must be defined for $target_name") | 
|  | assert(defined(invoker.args), "args must be defined for $target_name") | 
|  | assert(!defined(invoker.sources), | 
|  | "sources arg not supported for $target_name. Use inputs instead.") | 
|  |  | 
|  | vm_args = [] | 
|  | if (defined(invoker.vm_args)) { | 
|  | vm_args += invoker.vm_args | 
|  | } | 
|  |  | 
|  | _compiled_action(target_name) { | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "depfile", | 
|  | "deps", | 
|  | "inputs", | 
|  | "outputs", | 
|  | "pool", | 
|  | "tool", | 
|  | "testonly", | 
|  | "visibility", | 
|  | ]) | 
|  |  | 
|  | if (!defined(invoker.inputs)) { | 
|  | inputs = [] | 
|  | } | 
|  | if (defined(invoker.script)) { | 
|  | inputs += [ invoker.script ] | 
|  | } | 
|  | if (defined(invoker.packages)) { | 
|  | inputs += [ invoker.packages ] | 
|  | } | 
|  |  | 
|  | args = vm_args | 
|  | if (defined(invoker.packages)) { | 
|  | args += [ "--packages=" + rebase_path(invoker.packages) ] | 
|  | } | 
|  | if (defined(invoker.script)) { | 
|  | args += [ rebase_path(invoker.script) ] | 
|  | } | 
|  | args += invoker.args | 
|  | } | 
|  | } | 
|  |  | 
|  | # This template runs the Dart VM produced by the in-progress build. | 
|  | # | 
|  | # Parameters: | 
|  | #  script: | 
|  | #    The un-rebased path to the Dart script. | 
|  | # | 
|  | #  dfe (optional): | 
|  | #    Sets the DFE file used by Dart. If not set the VM will attempt to load it | 
|  | #    from a snapshot, or fall back on its built-in kernel. | 
|  | # | 
|  | #  vm_args (optional): | 
|  | #    Arguments to pass to the Dart VM. | 
|  | # | 
|  | #  args (optional): | 
|  | #    The arguments to pass to the Dart script. | 
|  | # | 
|  | #  packages (optional): | 
|  | #    The un-rebased path to the .packages file. | 
|  | # | 
|  | #  Forwarded to action() with the usual meaning: | 
|  | #    depfile | 
|  | #    deps | 
|  | #    inputs | 
|  | #    outputs | 
|  | #    testonly | 
|  | #    visibility | 
|  | template("dart_action") { | 
|  | assert(defined(invoker.script), "script must be defined for $target_name") | 
|  | if (!_is_fuchsia || !use_prebuilt_dart_sdk) { | 
|  | _built_tool_action(target_name) { | 
|  | tool = "$_dart_root/runtime/bin:dart" | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "args", | 
|  | "depfile", | 
|  | "deps", | 
|  | "inputs", | 
|  | "outputs", | 
|  | "packages", | 
|  | "pool", | 
|  | "script", | 
|  | "testonly", | 
|  | "tool", | 
|  | "visibility", | 
|  | "vm_args", | 
|  | ]) | 
|  |  | 
|  | # Dart has an implicit dependency on the kernel service so unless DFE is | 
|  | # passed, we need to add this dep. | 
|  | if (defined(invoker.dfe)) { | 
|  | vm_args += [ "--dfe=" + rebase_path(invoker.dfe) ] | 
|  | } else { | 
|  | if (!defined(invoker.deps)) { | 
|  | deps = [] | 
|  | } | 
|  | deps += [ "$_dart_root/utils/kernel-service:kernel-service" ] | 
|  | } | 
|  | } | 
|  | } else { | 
|  | prebuilt_dart_action(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | # This template runs the gen_snapshot produced by the in-progress build. | 
|  | # | 
|  | # Parameters: | 
|  | #  vm_args (optional): | 
|  | #    Arguments to pass to the Dart VM. | 
|  | # | 
|  | #  args (optional): | 
|  | #    The arguments to pass to the Dart script. | 
|  | # | 
|  | #  packages (optional): | 
|  | #    The un-rebased path to the package_config.json file. | 
|  | # | 
|  | #  Forwarded to action() with the usual meaning: | 
|  | #    depfile | 
|  | #    deps | 
|  | #    inputs | 
|  | #    outputs | 
|  | #    testonly | 
|  | #    visibility | 
|  | template("gen_snapshot_action") { | 
|  | assert( | 
|  | !defined(invoker.script), | 
|  | "script must not be defined for $target_name. If there is a script use args instead.") | 
|  | if (!_is_fuchsia || !use_prebuilt_dart_sdk) { | 
|  | _built_tool_action(target_name) { | 
|  | tool = "$_dart_root/runtime/bin:gen_snapshot" | 
|  | forward_variables_from(invoker, | 
|  | [ | 
|  | "args", | 
|  | "depfile", | 
|  | "deps", | 
|  | "inputs", | 
|  | "outputs", | 
|  | "packages", | 
|  | "pool", | 
|  | "testonly", | 
|  | "tool", | 
|  | "visibility", | 
|  | "vm_args", | 
|  | ]) | 
|  | } | 
|  | } else { | 
|  | _prebuilt_gen_snapshot_action(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  | } | 
|  | } | 
|  | } |