Skip sources collection for location functions in genrule.
Genrule already collects sources on its own. This prevents duplicated collection.
PiperOrigin-RevId: 419552446
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Expander.java b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
index 9cbdeff..a542a64 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
@@ -72,7 +72,7 @@
private Expander withLocations(boolean execPaths, boolean allowData) {
TemplateContext newTemplateContext =
new LocationTemplateContext(
- templateContext, ruleContext, labelMap, execPaths, allowData, false);
+ templateContext, ruleContext, labelMap, execPaths, allowData, true, false);
return new Expander(ruleContext, newTemplateContext, labelMap, lookedUpVariables);
}
@@ -96,16 +96,19 @@
* Returns a new instance that also expands locations, passing the given location map, as well as
* {@code execPaths} to the underlying {@link LocationTemplateContext}.
*/
- public Expander withExecLocations(
+ public Expander withExecLocationsNoSrcs(
ImmutableMap<Label, ImmutableCollection<Artifact>> locations, boolean windowsPath) {
TemplateContext newTemplateContext =
new LocationTemplateContext(
- templateContext, ruleContext, locations, true, false, windowsPath);
+ templateContext, ruleContext, locations, true, false, false, windowsPath);
return new Expander(ruleContext, newTemplateContext, labelMap, lookedUpVariables);
}
public Expander withExecLocations(ImmutableMap<Label, ImmutableCollection<Artifact>> locations) {
- return withExecLocations(locations, false);
+ TemplateContext newTemplateContext =
+ new LocationTemplateContext(
+ templateContext, ruleContext, locations, true, false, true, false);
+ return new Expander(ruleContext, newTemplateContext, labelMap, lookedUpVariables);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
index f8f5b78..00e51f5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
@@ -113,7 +113,7 @@
ruleContext.getLabel(),
// Use a memoizing supplier to avoid eagerly building the location map.
Suppliers.memoize(
- () -> LocationExpander.buildLocationMap(ruleContext, labelMap, allowData)),
+ () -> LocationExpander.buildLocationMap(ruleContext, labelMap, allowData, true)),
execPaths,
ruleContext.getConfiguration().legacyExternalRunfiles(),
ruleContext.getRule().getPackage().getRepositoryMapping());
@@ -380,7 +380,8 @@
static Map<Label, Collection<Artifact>> buildLocationMap(
RuleContext ruleContext,
Map<Label, ? extends Collection<Artifact>> labelMap,
- boolean allowDataAttributeEntriesInLabel) {
+ boolean allowDataAttributeEntriesInLabel,
+ boolean collectSrcs) {
Map<Label, Collection<Artifact>> locationMap = Maps.newHashMap();
if (labelMap != null) {
for (Map.Entry<Label, ? extends Collection<Artifact>> entry : labelMap.entrySet()) {
@@ -399,7 +400,7 @@
}
}
- if (ruleContext.getRule().isAttrDefined("srcs", BuildType.LABEL_LIST)) {
+ if (collectSrcs && ruleContext.getRule().isAttrDefined("srcs", BuildType.LABEL_LIST)) {
for (TransitiveInfoCollection src :
ruleContext.getPrerequisitesIf("srcs", FileProvider.class)) {
for (Label label : AliasProvider.getDependencyLabels(src)) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LocationTemplateContext.java b/src/main/java/com/google/devtools/build/lib/analysis/LocationTemplateContext.java
index 22d0097..f3e6678 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LocationTemplateContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LocationTemplateContext.java
@@ -72,13 +72,14 @@
@Nullable ImmutableMap<Label, ImmutableCollection<Artifact>> labelMap,
boolean execPaths,
boolean allowData,
+ boolean collectSrcs,
boolean windowsPath) {
this(
delegate,
ruleContext.getLabel(),
// Use a memoizing supplier to avoid eagerly building the location map.
Suppliers.memoize(
- () -> LocationExpander.buildLocationMap(ruleContext, labelMap, allowData)),
+ () -> LocationExpander.buildLocationMap(ruleContext, labelMap, allowData, collectSrcs)),
execPaths,
ruleContext.getConfiguration().legacyExternalRunfiles(),
ruleContext.getRule().getPackage().getRepositoryMapping(),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
index 47e2444..c3a1579 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
@@ -159,19 +159,17 @@
String baseCommand = ruleContext.attributes().get(cmdAttr, Type.STRING);
// Expand template variables and functions.
- ImmutableList.Builder<MakeVariableSupplier> makeVariableSuppliers =
- new ImmutableList.Builder<>();
CommandResolverContext commandResolverContext =
new CommandResolverContext(
ruleContext,
resolvedSrcs,
filesToBuild,
- makeVariableSuppliers.build(),
+ /* makeVariableSuppliers = */ ImmutableList.of(),
expandToWindowsPath);
String command =
ruleContext
.getExpander(commandResolverContext)
- .withExecLocations(commandHelper.getLabelMap(), expandToWindowsPath)
+ .withExecLocationsNoSrcs(commandHelper.getLabelMap(), expandToWindowsPath)
.expand(cmdAttr, baseCommand);
// Heuristically expand things that look like labels.