| # 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" ] |
| } |
| } |
| } |