| # 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("dart_host_sdk_toolchain.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 if there is one, |
| # and a built dart_bootstrap otherwise. 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. |
| # |
| # - dart_bootstrap_action() |
| # Ditto, but uses runtime/bin:dart_bootstrap. |
| # |
| # - 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 |
| } |
| |
| 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 + "($dart_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(defined(invoker.target), |
| "The target to use if the prebuilt doesn't exist must be defined") |
| |
| vm_args = [] |
| if (defined(invoker.vm_args)) { |
| vm_args += invoker.vm_args |
| } |
| |
| if (_is_fuchsia || prebuilt_dart_exe_works) { |
| not_needed(invoker, ["target"]) |
| action(target_name) { |
| forward_variables_from(invoker, [ |
| "depfile", |
| "deps", |
| "outputs", |
| "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.script)) { |
| args += [ rebase_path(invoker.script) ] |
| } |
| args += invoker.args |
| } |
| } else { |
| not_needed(invoker, ["binary"]) |
| _compiled_action(target_name) { |
| forward_variables_from(invoker, [ |
| "depfile", |
| "deps", |
| "inputs", |
| "outputs", |
| "testonly", |
| "visibility", |
| ]) |
| |
| if (defined(invoker.script)) { |
| inputs += [ invoker.script ] |
| } |
| if (defined(invoker.packages)) { |
| inputs += [ invoker.packages ] |
| } |
| |
| tool = invoker.target |
| 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 |
| } |
| } |
| } |
| |
| # 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 if one is available, and dart_bootstrap |
| # otherwise. |
| # |
| # 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 |
| } else { |
| binary = |
| "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix" |
| } |
| target = "$_dart_root/runtime/bin:dart_bootstrap" |
| } |
| } |
| |
| if (_is_fuchsia) { |
| template("_prebuilt_gen_snapshot_action") { |
| _prebuilt_tool_action(target_name) { |
| forward_variables_from(invoker, "*") |
| binary = prebuilt_gen_snapshot |
| target = "error" |
| } |
| } |
| } |
| |
| # 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", |
| "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. |
| # |
| # 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", |
| "script", |
| "testonly", |
| "tool", |
| "visibility", |
| "vm_args", |
| ]) |
| } |
| } else { |
| prebuilt_dart_action(target_name) { |
| forward_variables_from(invoker, "*") |
| } |
| } |
| } |
| |
| # This template runs the dart_bootstrap produced by the in-progress build. |
| # |
| # 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("dart_bootstrap_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_bootstrap" |
| forward_variables_from(invoker, [ |
| "args", |
| "depfile", |
| "deps", |
| "inputs", |
| "outputs", |
| "packages", |
| "script", |
| "testonly", |
| "tool", |
| "visibility", |
| "vm_args", |
| ]) |
| } |
| } else { |
| # We already have a prebuilt dart at the right version, so there is no |
| # reason to use dart_bootstrap. |
| 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 .packages 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", |
| "testonly", |
| "tool", |
| "visibility", |
| "vm_args", |
| ]) |
| } |
| } else { |
| _prebuilt_gen_snapshot_action(target_name) { |
| forward_variables_from(invoker, "*") |
| } |
| } |
| } |