dart-sdk/build/dart/dart_action.gni
William Hesse 1b249f5496 Revert "[infra] RBE all the things."
This reverts commit b3253d9c8b.

Reason for revert: Flutter build is broken, it also has a GN variable rbi_dir, and dart_action.gni now imports two conflicting definitions.

Original change's description:
> [infra] RBE all the things.
>
> This change offloads all Dart actions during the build to RBE using
> the new rewrapper_dart.py script that understands all the different
> command line invocations of Dart programs and translates it into the
> appropriate rewrapper invocation, with a full list of input and output
> files and no absolute paths.
>
> The dart actions are all considered to be expensive RBE compilation
> steps that may be much slower on RBE than locally due to the low
> parallelism of the build during these stages and the comperatively
> slower bots in the RBE pools. The build uses the racing strategy by
> default for these compilations, such that cache hits are still used
> if available, and otherwise a local build is transparently used if it
> happens to be faster. The bots will use the remote strategy by default
> unlike developers, such that the rewrapper_dart.py script does not fail.
>
> rewrapper_dart.py contains a tiny dart import proprocessor written
> in python and a big argument parser that understands every command
> invoked during the build and the semantic meaning of every option.
>
> The absolute paths used during the Dart SDK build is not solved in
> this changelist, which just works around them initially, but these
> will be fixed in follow up changes with the appropriate teams now
> that this change proves they are not needed.
>
> Bug: b/333595242
> Change-Id: I36603ec1bf16f4ac87d56635cc1c98e8686a4028
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335827
> Reviewed-by: William Hesse <whesse@google.com>
> Commit-Queue: Jonas Termansen <sortie@google.com>

Bug: b/333595242
Change-Id: I56c9df11e672e7bd096f2a6e7d0243dccd0396c9
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/362385
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Auto-Submit: William Hesse <whesse@google.com>
Commit-Queue: Alexander Thomas <athom@google.com>
Reviewed-by: Alexander Thomas <athom@google.com>
2024-04-12 10:08:28 +00:00

361 lines
11 KiB
Plaintext

# 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")
# 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")
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, root_build_dir),
] + vm_args
if (defined(invoker.packages)) {
args += [ "--packages=" + rebase_path(invoker.packages, root_build_dir) ]
}
if (defined(invoker.dfe)) {
args += [ "--dfe=" + rebase_path(invoker.dfe, root_build_dir) ]
}
if (defined(invoker.script)) {
args += [ rebase_path(invoker.script, root_build_dir) ]
}
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.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, "*")
binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart$executable_suffix"
dfe = "$_dart_root/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot"
}
}
# 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, root_build_dir) ]
}
if (defined(invoker.script)) {
args += [ rebase_path(invoker.script, root_build_dir) ]
}
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")
_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, root_build_dir) ]
} else {
if (!defined(invoker.deps)) {
deps = []
}
deps += [ "$_dart_root/utils/kernel-service:kernel-service" ]
}
}
}
# 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.
#
# force_product_mode (optional):
# Setting this to true will cause snapshot to be built in product mode even
# if dart_runtime_mode is not product.
#
# Forwarded to action() with the usual meaning:
# depfile
# deps
# inputs
# outputs
# testonly
# visibility
template("gen_snapshot_action") {
product_mode =
(defined(dart_runtime_mode) && dart_runtime_mode == "release") ||
(defined(invoker.force_product_mode) && invoker.force_product_mode)
assert(
!defined(invoker.script),
"script must not be defined for $target_name. If there is a script use args instead.")
_built_tool_action(target_name) {
if (product_mode) {
tool = "$_dart_root/runtime/bin:gen_snapshot_product"
} else {
tool = "$_dart_root/runtime/bin:gen_snapshot"
}
forward_variables_from(invoker,
[
"args",
"depfile",
"deps",
"inputs",
"outputs",
"packages",
"pool",
"testonly",
"tool",
"visibility",
"vm_args",
])
}
}