Use data dependencies in Make variable substitution This is a fix for #13930 Closes #13938. PiperOrigin-RevId: 430677775
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index fa1a04d..00194b0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -580,19 +580,29 @@ List<String> defines = new ArrayList<>(); // collect labels that can be subsituted in defines - ImmutableMap.Builder<Label, ImmutableCollection<Artifact>> builder = ImmutableMap.builder(); + Map<Label, ImmutableCollection<Artifact>> map = Maps.newLinkedHashMap(); if (ruleContext.attributes().has("deps", LABEL_LIST)) { for (TransitiveInfoCollection current : ruleContext.getPrerequisites("deps")) { - builder.put( + map.put( AliasProvider.getDependencyLabel(current), current.getProvider(FileProvider.class).getFilesToBuild().toList()); } } + if (ruleContext.attributes().has("data", LABEL_LIST)) { + for (TransitiveInfoCollection current : ruleContext.getPrerequisites("data")) { + Label dataDependencyLabel = AliasProvider.getDependencyLabel(current); + if (!map.containsKey(dataDependencyLabel)) { + map.put( + dataDependencyLabel, + current.getProvider(FileProvider.class).getFilesToBuild().toList()); + } + } + } // tokenize defines and substitute make variables for (String define : - ruleContext.getExpander().withExecLocations(builder.buildOrThrow()).list(attr)) { + ruleContext.getExpander().withExecLocations(ImmutableMap.copyOf(map)).list(attr)) { List<String> tokens = new ArrayList<>(); try { ShellUtils.tokenize(tokens, define);
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 bcd5028..3afcc8b 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
@@ -270,6 +270,21 @@ } @Test + public void testExpandedDefinesAgainstData() throws Exception { + scratch.file("data/BUILD", "filegroup(name = 'data', srcs = ['data.txt'])"); + ConfiguredTarget expandedDefines = + scratchConfiguredTarget( + "expanded_defines", + "expand_srcs", + "cc_library(name = 'expand_srcs',", + " srcs = ['defines.cc'],", + " data = ['//data'],", + " defines = ['FOO=$(location //data)'])"); + assertThat(expandedDefines.get(CcInfo.PROVIDER).getCcCompilationContext().getDefines()) + .containsExactly("FOO=data/data.txt"); + } + + @Test public void testStartEndLib() throws Exception { getAnalysisMock() .ccSupport()