C++: Introduces flag to disable automatic expansion of labels in linkopts.

LSC is finished.

RELNOTES:none
PiperOrigin-RevId: 199619978
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 f7558ff..317d52d 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 @@
     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 646ad4c..0b19fd4 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 @@
     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 c5adab6..04e197c 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 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 6dfc222..e7114af 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 @@
     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'])");
+  }
 }