From f7c23fdf0428252872bb695bd7d4b213dedce103 Mon Sep 17 00:00:00 2001 From: Michael Mitchell Date: Tue, 5 May 2026 22:25:41 -0700 Subject: [PATCH] Separate build script data from compile_data Keep cargo build script inputs available to their direct dependent without propagating them through transitive Rustc inputs. compile_data remains reserved for files that need to stay available to downstream consumers, such as generated link inputs. Update the existing cargo_build_script propagation test to distinguish the direct-dependent case from the transitive case. Co-authored-by: Codex --- cargo/private/cargo_build_script.bzl | 3 ++- cargo/private/cargo_dep_env.bzl | 2 ++ .../transitive_data/transitive_data_test.bzl | 17 ++++++++--------- extensions/bindgen/private/bindgen.bzl | 1 + rust/private/providers.bzl | 3 ++- rust/private/rustc.bzl | 1 + 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cargo/private/cargo_build_script.bzl b/cargo/private/cargo_build_script.bzl index 543c1e1169..58e3bf277a 100644 --- a/cargo/private/cargo_build_script.bzl +++ b/cargo/private/cargo_build_script.bzl @@ -688,7 +688,8 @@ def _cargo_build_script_impl(ctx): flags = flags_out, linker_flags = link_flags, link_search_paths = link_search_paths, - compile_data = depset([runfiles_dir] + extra_output, transitive = script_data), + build_script_data = depset(transitive = script_data), + compile_data = depset([runfiles_dir] + extra_output), ), OutputGroupInfo( **output_groups diff --git a/cargo/private/cargo_dep_env.bzl b/cargo/private/cargo_dep_env.bzl index 2fd0ab6bf4..728de77ec2 100644 --- a/cargo/private/cargo_dep_env.bzl +++ b/cargo/private/cargo_dep_env.bzl @@ -35,6 +35,7 @@ def _cargo_dep_env_impl(ctx): link_search_paths = empty_file, out_dir = out_dir, rustc_env = empty_file, + build_script_data = depset([]), compile_data = depset([]), )) return [ @@ -54,6 +55,7 @@ def _cargo_dep_env_impl(ctx): link_search_paths = empty_file, out_dir = None, rustc_env = empty_file, + build_script_data = depset([]), compile_data = depset([]), ), # Information here is used directly by dependencies, and it is an error to have more than diff --git a/cargo/tests/cargo_build_script/transitive_data/transitive_data_test.bzl b/cargo/tests/cargo_build_script/transitive_data/transitive_data_test.bzl index 1740c30921..c2512baa91 100644 --- a/cargo/tests/cargo_build_script/transitive_data/transitive_data_test.bzl +++ b/cargo/tests/cargo_build_script/transitive_data/transitive_data_test.bzl @@ -1,6 +1,4 @@ -"""Tests documenting that cargo_build_script `data` files currently act as both -compile_data and runtime data -- they appear in Rustc compile action inputs for -both the direct library and transitive dependents. +"""Tests for cargo_build_script `data` propagation into Rustc compile actions. See https://github.com/bazelbuild/rules_rust/issues/3609 for context.""" @@ -21,21 +19,20 @@ def _cbs_data_in_rustc_inputs_impl(ctx): asserts.false(env, rustc_action == None, "Expected a Rustc action") - # cargo_build_script `data` currently flows into BuildInfo.compile_data - # via script_data, so it appears in Rustc action inputs for both the - # direct dependent and transitive dependents. This documents that - # CBS `data` effectively acts as both compile_data and data today. data_inputs = [i for i in rustc_action.inputs.to_list() if "cbs_data_dep.txt" in i.path] - asserts.true( + asserts.equals( env, + ctx.attr.expected_present, len(data_inputs) > 0, - "Expected CBS data file to appear in Rustc action inputs (CBS data currently acts as compile_data)", ) return analysistest.end(env) cbs_data_in_rustc_inputs_test = analysistest.make( _cbs_data_in_rustc_inputs_impl, + attrs = { + "expected_present": attr.bool(), + }, ) def _define_test_targets(): @@ -98,11 +95,13 @@ def transitive_cbs_data_test_suite(name): cbs_data_in_rustc_inputs_test( name = "cbs_data_in_lib_compile_inputs_test", + expected_present = True, target_under_test = ":lib", ) cbs_data_in_rustc_inputs_test( name = "cbs_data_in_bin_compile_inputs_test", + expected_present = False, target_under_test = ":bin", ) diff --git a/extensions/bindgen/private/bindgen.bzl b/extensions/bindgen/private/bindgen.bzl index a25a0bc19e..7f541993fc 100644 --- a/extensions/bindgen/private/bindgen.bzl +++ b/extensions/bindgen/private/bindgen.bzl @@ -178,6 +178,7 @@ def _generate_cc_link_build_info(ctx, cc_lib): ) return BuildInfo( + build_script_data = depset([]), compile_data = depset(compile_data), dep_env = None, flags = rustc_flags_file, diff --git a/rust/private/providers.bzl b/rust/private/providers.bzl index a531884d19..3dd0483bdd 100644 --- a/rust/private/providers.bzl +++ b/rust/private/providers.bzl @@ -79,7 +79,8 @@ CrateGroupInfo = provider( BuildInfo = provider( doc = "A provider containing `rustc` build settings for a given Crate.", fields = { - "compile_data": "Depset[File]: Compile data provided by the build script that was not copied into `out_dir`.", + "build_script_data": "Depset[File]: Data inputs used by the build script that may also be referenced by its direct dependent.", + "compile_data": "Depset[File]: Compile data that should remain available to transitive dependents.", "dep_env": "Optional[File]: extra build script environment variables to be set to direct dependencies.", "flags": "Optional[File]: file containing additional flags to pass to rustc", "link_search_paths": "Optional[File]: file containing search paths to pass to rustc and linker", diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 69e2650604..fdb694f5ad 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -2196,6 +2196,7 @@ def _process_build_scripts( direct_inputs.append(build_info.linker_flags) transitive_inputs.append(build_info.compile_data) + transitive_inputs.append(getattr(build_info, "build_script_data", depset())) # We include transitive dep build_infos because cargo build scripts may generate files which get linked into the final binary. # This should probably only actually be exposed to actions which link.