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