blob: 36c06112d590716deac56de6c919296e6def3eea [file] [log] [blame]
# Copyright 2023 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/compute_inputs_for_analyze.gni")
import("//build/config/rust.gni")
if (compute_inputs_for_analyze) {
template("analyze_rust") {
_target_name = target_name
assert(defined(invoker.crate_root))
action("${_target_name}_collect_sources") {
forward_variables_from(invoker,
"*",
TESTONLY_AND_VISIBILITY + [
"inputs",
"script",
"sources",
"depfile",
"outputs",
"args",
])
forward_variables_from(invoker, [ "testonly" ])
script = "//build/rust/collect_rust_sources.py"
depfile = "${target_gen_dir}/${target_name}.verify.d"
outputs = [ depfile ]
args = [
"--generate-depfile",
"${rust_sysroot}/bin/rustc",
rebase_path(crate_root, root_build_dir),
rebase_path(depfile, root_build_dir),
"{{rustflags}}",
]
}
action(_target_name) {
forward_variables_from(invoker, [ "testonly" ])
# Constructs a depfile of all rust sources in the crate.
deps = [ ":${_target_name}_collect_sources" ]
# This target is reached once during `gn gen` and then again during
# `gn analyze`.
#
# 1. When doing `gn gen`, the ':${_target_name}_collect_sources'
# target generates a depfile containing all the rust sources of
# the crate. The exec_script() below runs first, and it produces an
# empty result.
# 2. When doing `gn analyze`, the exec_script() reads the depfile that
# was written during `gn gen` and puts each Rust file in the crate
# into `inputs`.
depfile_path = []
foreach(d, get_target_outputs(":${_target_name}_collect_sources")) {
depfile_path += [ rebase_path(d, root_build_dir) ]
}
# Here we read the depfile from `gn gen` when doing `gn analyze`, and
# add all the rust files in the crate to `inputs`. This ensures that
# analyze considers them as affecting tests that depend on the crate.
rust_srcs = exec_script("//build/rust/collect_rust_sources.py",
[ "--read-depfile" ] + depfile_path,
"list lines")
inputs = []
foreach(s, rust_srcs) {
inputs += [ rebase_path(s, "//", root_build_dir) ]
}
script = "//build/rust/collect_rust_sources.py"
args = [
"--stamp",
rebase_path("${target_gen_dir}/${target_name}.verify.stamp",
root_build_dir),
]
outputs = [ "${target_gen_dir}/${target_name}.verify.stamp" ]
}
}
}