diff --git a/rust/settings/BUILD.bazel b/rust/settings/BUILD.bazel index a93b91cc64..1d06dba9a9 100644 --- a/rust/settings/BUILD.bazel +++ b/rust/settings/BUILD.bazel @@ -26,6 +26,7 @@ load( "extra_rustc_flags", "incompatible_change_clippy_error_format", "incompatible_change_rust_test_compilation_output_directory", + "incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files", "incompatible_do_not_include_data_in_compile_data", "lto", "no_std", @@ -109,6 +110,8 @@ incompatible_change_clippy_error_format() incompatible_change_rust_test_compilation_output_directory() +incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files() + incompatible_do_not_include_data_in_compile_data() lto() diff --git a/rust/settings/settings.bzl b/rust/settings/settings.bzl index abedffa4c0..db9f69b0ed 100644 --- a/rust/settings/settings.bzl +++ b/rust/settings/settings.bzl @@ -218,6 +218,16 @@ def incompatible_change_rust_test_compilation_output_directory(): issue = "https://github.com/bazelbuild/rules_rust/issues/2827", ) +# buildifier: disable=unnamed-macro +def incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files(): + """A flag to omit the cc_toolchain's all_files from the rust toolchain's all_files depset. + """ + incompatible_flag( + name = "incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files", + build_setting_default = False, + issue = "https://github.com/bazelbuild/rules_rust/issues/3680", + ) + def experimental_link_std_dylib(): """A flag to control whether to link libstd dynamically.""" bool_flag( diff --git a/rust/toolchain.bzl b/rust/toolchain.bzl index f3ef2f2987..7c0281f67d 100644 --- a/rust/toolchain.bzl +++ b/rust/toolchain.bzl @@ -451,7 +451,7 @@ def _generate_sysroot( # Rustc sysroot_rustc = _symlink_sysroot_bin(ctx, name, "bin", rustc) - direct_files.extend([sysroot_rustc]) + direct_files.append(sysroot_rustc) # Rustc dependencies sysroot_rustc_lib = None @@ -461,43 +461,43 @@ def _generate_sysroot( # Rustdoc sysroot_rustdoc = _symlink_sysroot_bin(ctx, name, "bin", rustdoc) - direct_files.extend([sysroot_rustdoc]) + direct_files.append(sysroot_rustdoc) # Clippy sysroot_clippy = None if clippy: sysroot_clippy = _symlink_sysroot_bin(ctx, name, "bin", clippy) - direct_files.extend([sysroot_clippy]) + direct_files.append(sysroot_clippy) # Cargo sysroot_cargo = None if cargo: sysroot_cargo = _symlink_sysroot_bin(ctx, name, "bin", cargo) - direct_files.extend([sysroot_cargo]) + direct_files.append(sysroot_cargo) # Cargo-clippy sysroot_cargo_clippy = None if cargo_clippy: sysroot_cargo_clippy = _symlink_sysroot_bin(ctx, name, "bin", cargo_clippy) - direct_files.extend([sysroot_cargo_clippy]) + direct_files.append(sysroot_cargo_clippy) # Rustfmt sysroot_rustfmt = None if rustfmt: sysroot_rustfmt = _symlink_sysroot_bin(ctx, name, "bin", rustfmt) - direct_files.extend([sysroot_rustfmt]) + direct_files.append(sysroot_rustfmt) # Llvm tools sysroot_llvm_tools = None if llvm_tools: sysroot_llvm_tools = _symlink_sysroot_tree(ctx, name, llvm_tools) - transitive_file_sets.extend([sysroot_llvm_tools]) + transitive_file_sets.append(sysroot_llvm_tools) # Rust standard library sysroot_rust_std = None if rust_std: sysroot_rust_std = _symlink_sysroot_tree(ctx, name, rust_std) - transitive_file_sets.extend([sysroot_rust_std]) + transitive_file_sets.append(sysroot_rust_std) # Made available to support $(location) expansion in stdlib_linkflags and extra_rustc_flags. transitive_file_sets.append(depset(ctx.files.rust_std)) @@ -622,14 +622,10 @@ def _rust_toolchain_impl(ctx): } if sysroot.cargo: - make_variables.update({ - "CARGO": sysroot.cargo.path, - }) + make_variables["CARGO"] = sysroot.cargo.path if sysroot.rustfmt: - make_variables.update({ - "RUSTFMT": sysroot.rustfmt.path, - }) + make_variables["RUSTFMT"] = sysroot.rustfmt.path make_variable_info = platform_common.TemplateVariableInfo(make_variables) @@ -709,13 +705,17 @@ def _rust_toolchain_impl(ctx): ) # Include C++ toolchain files to ensure tools like 'ar' are available for cross-compilation - cc_toolchain, _ = find_cc_toolchain(ctx) - all_files_depsets = [sysroot.all_files] - if cc_toolchain and cc_toolchain.all_files: - all_files_depsets.append(cc_toolchain.all_files) + if ctx.attr._incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files[IncompatibleFlagInfo].enabled: + all_files = sysroot.all_files + else: + cc_toolchain, _ = find_cc_toolchain(ctx) + all_files_depsets = [sysroot.all_files] + if cc_toolchain and cc_toolchain.all_files: + all_files_depsets.append(cc_toolchain.all_files) + all_files = depset(transitive = all_files_depsets) toolchain = platform_common.ToolchainInfo( - all_files = depset(transitive = all_files_depsets), + all_files = all_files, binary_ext = ctx.attr.binary_ext, cargo = sysroot.cargo, clippy_driver = sysroot.clippy, @@ -987,6 +987,9 @@ rust_toolchain = rule( "_incompatible_change_rust_test_compilation_output_directory": attr.label( default = Label("//rust/settings:incompatible_change_rust_test_compilation_output_directory"), ), + "_incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files": attr.label( + default = Label("//rust/settings:incompatible_do_not_include_cc_toolchain_files_in_rust_toolchain_all_files"), + ), "_incompatible_do_not_include_data_in_compile_data": attr.label( default = Label("//rust/settings:incompatible_do_not_include_data_in_compile_data"), doc = "Label to a boolean build setting that controls whether to include data files in compile_data.",