Fixed location expansion in cc rules.
--
MOS_MIGRATED_REVID=134652924
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index f160424..49f1c92 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -38,6 +38,7 @@
import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator;
+import com.google.devtools.build.lib.analysis.LocationExpander.Options;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
@@ -939,7 +940,9 @@
* <p>This methods should be called only during initialization.
*/
public void tokenizeAndExpandMakeVars(List<String> tokens, String attributeName, String value) {
- tokenizeAndExpandMakeVars(tokens, attributeName, value, null);
+ LocationExpander locationExpander =
+ new LocationExpander(this, Options.ALLOW_DATA, Options.EXEC_PATHS);
+ tokenizeAndExpandMakeVars(tokens, attributeName, value, locationExpander);
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 1fab14f..da6e3b7 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -35,6 +35,7 @@
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.flags.InvocationPolicyEnforcer;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.testutil.MoreAsserts;
@@ -794,6 +795,24 @@
"cc_library(name='b', srcs=['b.cc'])");
}
+ @Test
+ public void testExpandedLinkopts() throws Exception {
+ scratch.file(
+ "a/BUILD",
+ "genrule(name = 'linker', cmd='generate', outs=['a.lds'])",
+ "cc_binary(",
+ " name='bin',",
+ " srcs=['b.cc'],",
+ " linkopts=['-Wl,@$(location a.lds)'],",
+ " deps=['a.lds'])");
+ ConfiguredTarget target = getConfiguredTarget("//a:bin");
+ CppLinkAction action =
+ (CppLinkAction) getGeneratingAction(getOnlyElement(getFilesToBuild(target)));
+ assertThat(action.getLinkCommandLine().getLinkopts()).containsExactly(
+ String.format("-Wl,@%s/genfiles/a/a.lds", getTargetConfiguration().getOutputDirectory(
+ RepositoryName.MAIN).getExecPath().getPathString()));
+ }
+
@RunWith(JUnit4.class)
public static class OnlyCppRules extends CcCommonTest {
@Override