Let artifacts declare that they use content-based paths.
This is basic infrastructure for supporting --experiment_output_paths=content. This change does not implement any actual uses.
The intention is that we can incrementally opt in content-mapping support, i.e. rules can declare which of their outputs should do content mapping. The first test goal will be to opt in java_library compilation.
"Experimental Content-Based Output Paths" design: https://docs.google.com/document/d/17snvmic26-QdGuwVw55Gl0oOufw9sCVuOAvHqGZJFr4/edit
See https://github.com/bazelbuild/bazel/issues/8339
PiperOrigin-RevId: 252148134
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 b4ab0d7..72549d1 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
@@ -686,7 +686,17 @@
@Override
public Artifact.DerivedArtifact getPackageRelativeArtifact(
PathFragment relative, ArtifactRoot root) {
- return getDerivedArtifact(getPackageDirectory().getRelative(relative), root);
+ return getPackageRelativeArtifact(relative, root, /*contentBasedPath=*/ false);
+ }
+
+ /**
+ * Same as {@link #getPackageRelativeArtifact(PathFragment, ArtifactRoot)} but includes the option
+ * option to use a content-based path for this artifact (see {@link
+ * BuildConfiguration#useContentBasedOutputPaths()}).
+ */
+ private Artifact.DerivedArtifact getPackageRelativeArtifact(
+ PathFragment relative, ArtifactRoot root, boolean contentBasedPath) {
+ return getDerivedArtifact(getPackageDirectory().getRelative(relative), root, contentBasedPath);
}
/**
@@ -694,7 +704,17 @@
* guaranteeing that it never clashes with artifacts created by rules in other packages.
*/
public Artifact getPackageRelativeArtifact(String relative, ArtifactRoot root) {
- return getPackageRelativeArtifact(PathFragment.create(relative), root);
+ return getPackageRelativeArtifact(relative, root, /*contentBasedPath=*/ false);
+ }
+
+ /**
+ * Same as {@link #getPackageRelativeArtifact(String, ArtifactRoot)} but includes the option to
+ * use a content-based path for this artifact (see {@link
+ * BuildConfiguration#useContentBasedOutputPaths()}).
+ */
+ private Artifact getPackageRelativeArtifact(
+ String relative, ArtifactRoot root, boolean contentBasedPath) {
+ return getPackageRelativeArtifact(PathFragment.create(relative), root, contentBasedPath);
}
@Override
@@ -712,10 +732,20 @@
@Override
public Artifact.DerivedArtifact getDerivedArtifact(
PathFragment rootRelativePath, ArtifactRoot root) {
+ return getDerivedArtifact(rootRelativePath, root, /*contentBasedPath=*/ false);
+ }
+
+ /**
+ * Same as {@link #getDerivedArtifact(PathFragment, ArtifactRoot)} but includes the option to use
+ * a content-based path for this artifact (see {@link
+ * BuildConfiguration#useContentBasedOutputPaths()}).
+ */
+ public Artifact.DerivedArtifact getDerivedArtifact(
+ PathFragment rootRelativePath, ArtifactRoot root, boolean contentBasedPath) {
Preconditions.checkState(rootRelativePath.startsWith(getPackageDirectory()),
"Output artifact '%s' not under package directory '%s' for target '%s'",
rootRelativePath, getPackageDirectory(), getLabel());
- return getAnalysisEnvironment().getDerivedArtifact(rootRelativePath, root);
+ return getAnalysisEnvironment().getDerivedArtifact(rootRelativePath, root, contentBasedPath);
}
@Override
@@ -1351,6 +1381,16 @@
@Override
public Artifact getImplicitOutputArtifact(ImplicitOutputsFunction function)
throws InterruptedException {
+ return getImplicitOutputArtifact(function, /*contentBasedPath=*/ false);
+ }
+
+ /**
+ * Same as {@link #getImplicitOutputArtifact(ImplicitOutputsFunction)} but includes the option to
+ * use a content-based path for this artifact (see {@link
+ * BuildConfiguration#useContentBasedOutputPaths()}).
+ */
+ public Artifact getImplicitOutputArtifact(
+ ImplicitOutputsFunction function, boolean contentBasedPath) throws InterruptedException {
Iterable<String> result;
try {
result =
@@ -1360,14 +1400,23 @@
// It's ok as long as we don't use this method from Skylark.
throw new IllegalStateException(e);
}
- return getImplicitOutputArtifact(Iterables.getOnlyElement(result));
+ return getImplicitOutputArtifact(Iterables.getOnlyElement(result), contentBasedPath);
}
/**
* Only use from Skylark. Returns the implicit output artifact for a given output path.
*/
public Artifact getImplicitOutputArtifact(String path) {
- return getPackageRelativeArtifact(path, getBinOrGenfilesDirectory());
+ return getImplicitOutputArtifact(path, /*contentBasedPath=*/ false);
+ }
+
+ /**
+ * Same as {@link #getImplicitOutputArtifact(String)} but includes the option to use a a
+ * content-based path for this artifact (see {@link
+ * BuildConfiguration#useContentBasedOutputPaths()}).
+ */
+ private Artifact getImplicitOutputArtifact(String path, boolean contentBasedPath) {
+ return getPackageRelativeArtifact(path, getBinOrGenfilesDirectory(), contentBasedPath);
}
/**