From 15cdc1acf35016ab768f7178a78595d2608c82b3 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Mon, 22 Jun 2026 12:38:06 -0400 Subject: [PATCH] Move legacy whole-archive flags to the graveyard --incompatible_remove_legacy_whole_archive was introduced disabled in February 2019 by e5735fd27d and enabled by default in September 2019 by 799328f8e0. Since then, --legacy_whole_archive only affected builds that explicitly restored the pre-migration behavior. Return the established values from the private Starlark compatibility accessors and retain deprecated graveyard no-ops so existing command lines remain accepted. Update the linking tests to cover the established behavior. RELNOTES: --legacy_whole_archive and --incompatible_remove_legacy_whole_archive are now deprecated no-ops. --- .../lib/bazel/rules/BazelRulesModule.java | 20 +++++++++++++ .../build/lib/rules/cpp/CppConfiguration.java | 4 +-- .../build/lib/rules/cpp/CppOptions.java | 29 ------------------- .../common/builtin_exec_platforms.bzl | 1 - .../lib/rules/cpp/CppLinkActionTest.java | 3 +- .../lib/rules/cpp/LibraryLinkingTest.java | 10 ++----- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java index 316f5d70a1c87c..dab201d6a2c697 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java @@ -589,6 +589,26 @@ public abstract static class BazelBuildGraveyardOptions extends BuildGraveyardOp help = "Deprecated no-op.") public abstract boolean getDisableLegacyCcProvider(); + @Deprecated + @Option( + name = "legacy_whole_archive", + defaultValue = "true", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.NO_OP}, + metadataTags = {OptionMetadataTag.DEPRECATED}, + help = "Deprecated no-op.") + public abstract boolean getLegacyWholeArchive(); + + @Deprecated + @Option( + name = "incompatible_remove_legacy_whole_archive", + defaultValue = "true", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.NO_OP}, + metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE, OptionMetadataTag.DEPRECATED}, + help = "Deprecated no-op.") + public abstract boolean getRemoveLegacyWholeArchive(); + @Option( name = "python_path", defaultValue = "", diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index e0050f8371d329..b37da94c36f160 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -486,7 +486,7 @@ public boolean experimentalLinkStaticLibrariesOnce() { @StarlarkMethod(name = "legacy_whole_archive", documented = false, useStarlarkThread = true) public boolean legacyWholeArchiveForStarlark(StarlarkThread thread) throws EvalException { CcModule.checkPrivateStarlarkificationAllowlist(thread); - return cppOptions.getLegacyWholeArchive(); + return true; } @StarlarkMethod( @@ -495,7 +495,7 @@ public boolean legacyWholeArchiveForStarlark(StarlarkThread thread) throws EvalE useStarlarkThread = true) public boolean removeLegacyWholeArchiveForStarlark(StarlarkThread thread) throws EvalException { CcModule.checkPrivateStarlarkificationAllowlist(thread); - return cppOptions.getRemoveLegacyWholeArchive(); + return true; } public boolean getInmemoryDotdFiles() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java index 06a51a22638a89..f693a48fd8094d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java @@ -361,24 +361,6 @@ public String getTypeDescription() { converter = LabelConverter.class) public abstract Label getCustomMalloc(); - // @Deprecated - // TODO(https://github.com/bazelbuild/bazel/pull/26854): figure out how to deprecate - // this without warning spam because of a globally set bazelrc. - @Option( - name = "legacy_whole_archive", - defaultValue = "true", - documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, - effectTags = {OptionEffectTag.ACTION_COMMAND_LINES, OptionEffectTag.AFFECTS_OUTPUTS}, - metadataTags = {OptionMetadataTag.HIDDEN}, - help = - "Deprecated, superseded by --incompatible_remove_legacy_whole_archive " - + "(see https://github.com/bazelbuild/bazel/issues/7362 for details). " - + "When on, use --whole-archive for cc_binary rules that have " - + "linkshared=True and either linkstatic=True or '-static' in linkopts. " - + "This is for backwards compatibility only. " - + "A better alternative is to use alwayslink=1 where required.") - public abstract boolean getLegacyWholeArchive(); - @Option( name = "strip", defaultValue = "sometimes", @@ -825,17 +807,6 @@ public Label getMemProfProfileLabelValue() { help = "This flag is a noop and scheduled for removal.") public abstract boolean getRequireCtxInConfigureFeatures(); - @Option( - name = "incompatible_remove_legacy_whole_archive", - defaultValue = "true", - documentationCategory = OptionDocumentationCategory.TOOLCHAIN, - effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, - metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, - help = - "If true, Bazel will not link library dependencies as whole archive by default " - + "(see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions).") - public abstract boolean getRemoveLegacyWholeArchive(); - @Option( name = "incompatible_enable_cc_toolchain_resolution", defaultValue = "true", diff --git a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl index 75d8939a812cee..d600856d35c37a 100644 --- a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl +++ b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl @@ -262,7 +262,6 @@ bazel_fragments["CppOptions"] = fragment( "//command_line_option:start_end_lib", "//command_line_option:experimental_inmemory_dotd_files", "//command_line_option:incompatible_enable_cc_toolchain_resolution", - "//command_line_option:incompatible_remove_legacy_whole_archive", "//command_line_option:incompatible_dont_enable_host_nonhost_crosstool_features", "//command_line_option:incompatible_require_ctx_in_configure_features", "//command_line_option:incompatible_make_thinlto_command_lines_standalone", diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java index 1175d9fd0b62d1..75831fa2f532cb 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java @@ -207,7 +207,7 @@ public void testLinkoptsAndLibSrcsAreInCorrectOrder() throws Exception { } @Test - public void testLegacyWholeArchiveHasNoEffectOnDynamicModeDynamicLibraries() throws Exception { + public void testDynamicModeDynamicLibrariesDoNotUseWholeArchive() throws Exception { getAnalysisMock() .ccSupport() .setupCcToolchainConfig( @@ -224,7 +224,6 @@ public void testLegacyWholeArchiveHasNoEffectOnDynamicModeDynamicLibraries() thr linkstatic = 0, ) """); - useConfiguration("--legacy_whole_archive"); assertThat(getLibfooArguments()).doesNotContain("-Wl,-whole-archive"); } diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java index c9995740bd9993..7be9596e7ff3f1 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LibraryLinkingTest.java @@ -46,16 +46,14 @@ private void assertLinkopts(SpawnAction linkAction, String... optionPatterns) th } @Test - public void testGeneratedLib() throws Exception { + public void testGeneratedLibraryLinkedWithoutWholeArchive() throws Exception { getAnalysisMock() .ccSupport() .setupCcToolchainConfig( mockToolsConfig, CcToolchainConfig.builder().withFeatures(CppRuleClasses.SUPPORTS_DYNAMIC_LINKER)); - useConfiguration( - "--platforms=" + TestConstants.PLATFORM_LABEL, - "--noincompatible_remove_legacy_whole_archive"); + useConfiguration("--platforms=" + TestConstants.PLATFORM_LABEL); ConfiguredTarget genlib = scratchConfiguredTarget( "genrule", @@ -79,9 +77,7 @@ public void testGeneratedLib() throws Exception { "-shared", "-o", analysisMock.getProductName() + "-out/.+/genrule/thebinary.so", - "-Wl,-whole-archive", - analysisMock.getProductName() + "-out/.+/genrule/genlib.a", - "-Wl,-no-whole-archive"); + analysisMock.getProductName() + "-out/.+/genrule/genlib.a"); } /**