diff options
4 files changed, 35 insertions, 1 deletions
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 f7558ffa75..317d52db40 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 @@ -995,6 +995,10 @@ public final class CppConfiguration extends BuildConfiguration.Fragment return cppOptions.useInterfaceSharedObjects; } + public boolean getExpandLinkoptsLabels() { + return cppOptions.expandLinkoptsLabels; + } + /** * Returns the path to the GNU binutils 'objcopy' binary to use for this build. (Corresponds to * $(OBJCOPY) in make-dbg.) Relative paths are relative to the execution root. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 646ad4c9e6..0b19fd488f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -200,7 +200,8 @@ public class CppHelper { List<String> result = new ArrayList<>(); Expander expander = ruleContext.getExpander().withDataExecLocations(); for (String value : values) { - if (isLinkoptLabel(value)) { + if (ruleContext.getFragment(CppConfiguration.class).getExpandLinkoptsLabels() + && isLinkoptLabel(value)) { if (!expandLabel(ruleContext, result, value)) { ruleContext.attributeError(attrName, "could not resolve label '" + value + "'"); } 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 c5adab6cad..04e197ce62 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 @@ -966,6 +966,15 @@ public class CppOptions extends FragmentOptions { ) public boolean useLLVMCoverageMapFormat; + @Option( + name = "experimental_expand_linkopts_labels", + defaultValue = "true", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + help = "If true, entries in linkopts that are not preceded by - or $ will be expanded.") + public boolean expandLinkoptsLabels; + @Override public FragmentOptions getHost() { CppOptions host = (CppOptions) getDefault(); diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index 6dfc222072..e7114af55e 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java @@ -1513,4 +1513,24 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase { useConfiguration("--experimental_stl=//a:stl"); getConfiguredTarget("//a:a"); } + + @Test + public void testNoExpandLinkoptsLabels() throws Exception { + useConfiguration("--noexperimental_expand_linkopts_labels"); + scratchConfiguredTarget( + "b", "b", "cc_library(", " name = 'b',", " linkopts=['//foo/bar'])"); + assertNoEvents(); + } + + @Test + public void testExpandLinkoptsLabels() throws Exception { + useConfiguration("--experimental_expand_linkopts_labels"); + checkError( + "b", + "b", + "could not resolve label", + "cc_library(", + " name = 'b',", + " linkopts=['//foo/bar'])"); + } } |