Plumb transitive packages to RuleContext
To fix https://github.com/bazelbuild/bazel/issues/16124, we need to collect all the repos/repo mappings relevant for a runfiles directory and write that into a manifest. One way to do that is to utilize the existing `transitivePackagesForPackageRootResolution` thing that we collect in most cases.
This CL plumbs this information through to RuleContext (whereafter it can be used by RunfilesSupport to write a manifest), without any logic changes. The field `transitivePackagesForPackageRootResolution` is renamed to simply `transitivePackages` since it's now used for multiple purposes.
Closes https://github.com/bazelbuild/bazel/pull/16278.
PiperOrigin-RevId: 474778287
Change-Id: I7158c8adacc0b1db7f7bdda3b621d49c1fdb491c
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 d7fa514..959fc15 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
@@ -76,6 +76,7 @@
import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.OutputFile;
+import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Package.ConfigSettingVisibilityPolicy;
import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
@@ -165,6 +166,7 @@
@Nullable private final ToolchainCollection<ResolvedToolchainContext> toolchainContexts;
private final ExecGroupCollection execGroupCollection;
@Nullable private final RequiredConfigFragmentsProvider requiredConfigFragments;
+ @Nullable private final NestedSet<Package> transitivePackagesForRunfileRepoMappingManifest;
private final List<Expander> makeVariableExpanders = new ArrayList<>();
/** Map of exec group names to ActionOwners. */
@@ -222,6 +224,8 @@
this.toolchainContexts = builder.toolchainContexts;
this.execGroupCollection = execGroupCollection;
this.requiredConfigFragments = builder.requiredConfigFragments;
+ this.transitivePackagesForRunfileRepoMappingManifest =
+ builder.transitivePackagesForRunfileRepoMappingManifest;
this.starlarkThread = createStarlarkThread(builder.mutability); // uses above state
}
@@ -1285,6 +1289,17 @@
return merged == null ? requiredConfigFragments : merged.build();
}
+ /**
+ * Returns the set of transitive packages. This is only intended to be used to create the repo
+ * mapping manifest for the runfiles tree. Can be null if transitive packages are not tracked (see
+ * {@link
+ * com.google.devtools.build.lib.skyframe.SkyframeExecutor#shouldStoreTransitivePackagesInLoadingAndAnalysis}).
+ */
+ @Nullable
+ public NestedSet<Package> getTransitivePackagesForRunfileRepoMappingManifest() {
+ return transitivePackagesForRunfileRepoMappingManifest;
+ }
+
private boolean isUserDefinedMakeVariable(String makeVariable) {
// User-defined make values may be set either in "--define foo=bar" or in a vardef in the rule's
// package. Both are equivalent for these purposes, since in both cases setting
@@ -1651,6 +1666,7 @@
private ExecGroupCollection.Builder execGroupCollectionBuilder;
private ImmutableMap<String, String> rawExecProperties;
@Nullable private RequiredConfigFragmentsProvider requiredConfigFragments;
+ @Nullable private NestedSet<Package> transitivePackagesForRunfileRepoMappingManifest;
@VisibleForTesting
public Builder(
@@ -1877,6 +1893,12 @@
return this;
}
+ @CanIgnoreReturnValue
+ public Builder setTransitivePackagesForRunfileRepoMappingManifest(
+ @Nullable NestedSet<Package> packages) {
+ this.transitivePackagesForRunfileRepoMappingManifest = packages;
+ return this;
+ }
/** Determines and returns a map from attribute name to list of configured targets. */
private ImmutableSortedKeyListMultimap<String, ConfiguredTargetAndData> createTargetMap() {