aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Artifact.java60
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java14
-rw-r--r--src/test/java/com/google/devtools/build/lib/BUILD3
-rw-r--r--src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java19
-rw-r--r--src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/BUILD2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java10
9 files changed, 104 insertions, 23 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
index f1d91ba376..000f359315 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
@@ -23,6 +23,9 @@ import com.google.common.collect.Maps;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import java.util.ArrayList;
@@ -187,7 +190,11 @@ public class ActionLookupValue implements SkyValue {
* subclasses of ActionLookupKey. This allows callers to easily find the value key, while
* remaining agnostic to what ActionLookupValues actually exist.
*/
+ @AutoCodec(strategy = Strategy.POLYMORPHIC)
public abstract static class ActionLookupKey implements ArtifactOwner, SkyKey {
+ public static final ObjectCodec<ActionLookupKey> CODEC =
+ new ActionLookupValue_ActionLookupKey_AutoCodec();
+
@Override
public Label getLabel() {
return null;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index d45d16d587..6993478742 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -31,6 +31,9 @@ import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.shell.ShellUtils;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -40,6 +43,7 @@ import com.google.devtools.build.lib.syntax.EvalUtils;
import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.FileTypeSet;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
@@ -115,6 +119,7 @@ import javax.annotation.Nullable;
+ " Then you can access the File through the rule's "
+ "<a href='ctx.html#outputs'>ctx.outputs</a>."
)
+@AutoCodec(dependency = FileSystemProvider.class)
public class Artifact
implements FileType.HasFileType,
ActionInput,
@@ -122,6 +127,9 @@ public class Artifact
Comparable<Object>,
CommandLineItem {
+ public static final InjectingObjectCodec<Artifact, FileSystemProvider> CODEC =
+ new Artifact_AutoCodec();
+
/** Compares artifact according to their exec paths. Sorts null values first. */
@SuppressWarnings("ReferenceEquality") // "a == b" is an optimization
public static final Comparator<Artifact> EXEC_PATH_COMPARATOR =
@@ -194,6 +202,7 @@ public class Artifact
* </pre>
*/
@VisibleForTesting
+ @AutoCodec.Instantiator
public Artifact(Path path, ArtifactRoot root, PathFragment execPath, ArtifactOwner owner) {
if (root == null || !root.getRoot().contains(path)) {
throw new IllegalArgumentException(root + ": illegal root for " + path
@@ -454,16 +463,21 @@ public class Artifact
/**
* A special kind of artifact that either is a fileset or needs special metadata caching behavior.
*
- * <p>We subclass {@link Artifact} instead of storing the special attributes inside in order
- * to save memory. The proportion of artifacts that are special is very small, and by not having
- * to keep around the attribute for the rest we save some memory.
+ * <p>We subclass {@link Artifact} instead of storing the special attributes inside in order to
+ * save memory. The proportion of artifacts that are special is very small, and by not having to
+ * keep around the attribute for the rest we save some memory.
*/
@Immutable
@VisibleForTesting
+ @AutoCodec(dependency = FileSystemProvider.class)
public static final class SpecialArtifact extends Artifact {
+
+ public static final InjectingObjectCodec<SpecialArtifact, FileSystemProvider> CODEC =
+ new Artifact_SpecialArtifact_AutoCodec();
+
private final SpecialArtifactType type;
- @VisibleForTesting
+ @VisibleForSerialization
public SpecialArtifact(
Path path,
ArtifactRoot root,
@@ -508,19 +522,24 @@ public class Artifact
}
/**
- * A special kind of artifact that represents a concrete file created at execution time under
- * its associated TreeArtifact.
+ * A special kind of artifact that represents a concrete file created at execution time under its
+ * associated TreeArtifact.
*
- * <p> TreeFileArtifacts should be only created during execution time inside some special actions
- * to support action inputs and outputs that are unpredictable at analysis time.
- * TreeFileArtifacts should not be created directly by any rules at analysis time.
+ * <p>TreeFileArtifacts should be only created during execution time inside some special actions
+ * to support action inputs and outputs that are unpredictable at analysis time. TreeFileArtifacts
+ * should not be created directly by any rules at analysis time.
*
- * <p>We subclass {@link Artifact} instead of storing the extra fields directly inside in order
- * to save memory. The proportion of TreeFileArtifacts is very small, and by not having to keep
+ * <p>We subclass {@link Artifact} instead of storing the extra fields directly inside in order to
+ * save memory. The proportion of TreeFileArtifacts is very small, and by not having to keep
* around the extra fields for the rest we save some memory.
*/
@Immutable
+ @AutoCodec(dependency = FileSystemProvider.class)
public static final class TreeFileArtifact extends Artifact {
+
+ public static final InjectingObjectCodec<TreeFileArtifact, FileSystemProvider> CODEC =
+ new Artifact_TreeFileArtifact_AutoCodec();
+
private final Artifact parentTreeArtifact;
private final PathFragment parentRelativePath;
@@ -537,23 +556,24 @@ public class Artifact
* Constructs a TreeFileArtifact with the given parent-relative path under the given parent
* TreeArtifact, owned by the given {@code artifactOwner}.
*/
- TreeFileArtifact(Artifact parent, PathFragment parentRelativePath,
- ArtifactOwner artifactOwner) {
+ @AutoCodec.Instantiator
+ TreeFileArtifact(
+ Artifact parentTreeArtifact, PathFragment parentRelativePath, ArtifactOwner owner) {
super(
- parent.getPath().getRelative(parentRelativePath),
- parent.getRoot(),
- parent.getExecPath().getRelative(parentRelativePath),
- artifactOwner);
+ parentTreeArtifact.getPath().getRelative(parentRelativePath),
+ parentTreeArtifact.getRoot(),
+ parentTreeArtifact.getExecPath().getRelative(parentRelativePath),
+ owner);
Preconditions.checkState(
- parent.isTreeArtifact(),
+ parentTreeArtifact.isTreeArtifact(),
"The parent of TreeFileArtifact (parent-relative path: %s) is not a TreeArtifact: %s",
parentRelativePath,
- parent);
+ parentTreeArtifact);
Preconditions.checkState(
parentRelativePath.isNormalized() && !parentRelativePath.isAbsolute(),
"%s is not a proper normalized relative path",
parentRelativePath);
- this.parentTreeArtifact = parent;
+ this.parentTreeArtifact = parentTreeArtifact;
this.parentRelativePath = parentRelativePath;
}
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
index 3363dc33da..1a84425e61 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java
@@ -17,11 +17,15 @@ package com.google.devtools.build.lib.actions;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.Root;
@@ -52,8 +56,12 @@ import java.util.Objects;
+ "together into a single directory tree to form the execution environment."
)
@Immutable
+@AutoCodec(dependency = FileSystemProvider.class)
public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializable, SkylarkValue {
+ public static final InjectingObjectCodec<ArtifactRoot, FileSystemProvider> CODEC =
+ new ArtifactRoot_AutoCodec();
+
// This must always be consistent with Package.getSourceRoot; otherwise computing source roots
// from exec paths does not work, which can break the action cache for input-discovering actions.
public static ArtifactRoot computeSourceRoot(Root packageRoot, RepositoryName repository) {
@@ -96,7 +104,8 @@ public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializabl
return new ArtifactRoot(Root.fromPath(root), execPath, RootType.Middleman);
}
- private enum RootType {
+ @VisibleForSerialization
+ enum RootType {
Source,
Output,
Middleman
@@ -106,7 +115,8 @@ public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializabl
private final PathFragment execPath;
private final RootType rootType;
- private ArtifactRoot(Root root, PathFragment execPath, RootType rootType) {
+ @AutoCodec.Instantiator
+ ArtifactRoot(Root root, PathFragment execPath, RootType rootType) {
this.root = Preconditions.checkNotNull(root);
this.execPath = execPath;
this.rootType = rootType;
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 5edd716518..7cbf304f16 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -484,6 +484,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/clock",
"//src/main/java/com/google/devtools/build/lib/concurrent",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/build/skyframe",
@@ -522,6 +523,8 @@ java_test(
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
"//src/main/java/com/google/devtools/common/options",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
index cd47c41b81..363bae9df3 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
@@ -25,6 +25,8 @@ import com.google.devtools.build.lib.actions.util.LabelArtifactOwner;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -339,6 +341,23 @@ public class ArtifactTest {
}
@Test
+ public void testCodec() throws Exception {
+ ObjectCodecTester.newBuilder(
+ new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem()))
+ .addSubjects(
+ new Artifact(PathFragment.create("src/a"), rootDir),
+ new Artifact(
+ PathFragment.create("src/b"), ArtifactRoot.asSourceRoot(Root.fromPath(execDir))),
+ new Artifact(
+ scratch.file("/src/c"),
+ ArtifactRoot.asDerivedRoot(
+ scratch.getFileSystem().getPath("/"), scratch.dir("/src")),
+ PathFragment.create("c"),
+ new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//foo:bar"))))
+ .buildAndRunTests();
+ }
+
+ @Test
public void testLongDirname() throws Exception {
String dirName = createDirNameArtifact().getDirname();
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java b/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java
index 1baf5b4de0..0d24177180 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java
@@ -16,12 +16,17 @@ package com.google.devtools.build.lib.actions.util;
import com.google.common.annotations.VisibleForTesting;
import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.cmdline.Label;
-
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import java.util.Objects;
/** ArtifactOwner wrapper for Labels, for use in tests. */
@VisibleForTesting
+@AutoCodec
public class LabelArtifactOwner implements ArtifactOwner {
+
+ public static final ObjectCodec<LabelArtifactOwner> CODEC = new LabelArtifactOwner_AutoCodec();
+
private final Label label;
@VisibleForTesting
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index e9cfbfda0d..3896f0a261 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -31,6 +31,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib/collect",
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/rules/platform",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
@@ -79,6 +80,7 @@ java_test(
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 27e95b58bb..3b39d03441 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -65,6 +65,7 @@ import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAc
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
+import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -494,6 +495,10 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase {
}
private static class SingletonActionLookupKey extends ActionLookupValue.ActionLookupKey {
+
+ public static final SingletonCodec<SingletonActionLookupKey> CODEC =
+ SingletonCodec.of(new SingletonActionLookupKey(), "none");
+
@Override
public SkyFunctionName functionName() {
return SkyFunctions.CONFIGURED_TARGET;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
index 1a9063b33f..675030c84f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
@@ -52,6 +52,8 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventKind;
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.vfs.FileStatus;
import com.google.devtools.build.lib.vfs.FileSystem;
@@ -114,6 +116,14 @@ public class TreeArtifactBuildTest extends TimestampBuilderTestCase {
outTwoFileTwo = treeFileArtifact(outTwo, "out_one_file_two");
}
+ @Test
+ public void testCodec() throws Exception {
+ ObjectCodecTester.newBuilder(
+ new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem()))
+ .addSubjects(outOne, outOneFileOne)
+ .buildAndRunTests();
+ }
+
/** Simple smoke test. If this isn't passing, something is very wrong... */
@Test
public void testTreeArtifactSimpleCase() throws Exception {