aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar shahan <shahan@google.com>2018-01-10 18:02:30 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-10 18:04:31 -0800
commit9694cae29752d205edcf45cb89e37f440eda6b0d (patch)
tree080a88fd72f3d06a57d14d18f6def3859f32e333 /src/main/java
parentda8fea3689e0fb9cde8142ff80c51a6813b72ed6 (diff)
Codec for BuildConfigurationValue.
PiperOrigin-RevId: 181545835
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java54
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java11
7 files changed, 109 insertions, 129 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index 66c0f14126..6fe3253a12 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,14 +18,11 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.hash.HashCode;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
+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.util.StringCanonicalizer;
+import com.google.devtools.build.lib.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathCodec;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
import java.util.Objects;
/**
@@ -47,8 +44,11 @@ import java.util.Objects;
*
* <p>Do not put shortcuts to specific files here!
*/
+@AutoCodec(dependency = FileSystemProvider.class)
@Immutable
public final class BlazeDirectories {
+ public static final InjectingObjectCodec<BlazeDirectories, FileSystemProvider> CODEC =
+ new BlazeDirectories_AutoCodec();
// Include directory name, relative to execRoot/blaze-out/configuration.
public static final String RELATIVE_INCLUDE_DIR = StringCanonicalizer.intern("include");
@@ -66,6 +66,7 @@ public final class BlazeDirectories {
private final Path localOutputPath;
private final String productName;
+ @AutoCodec.Constructor
public BlazeDirectories(ServerDirectories serverDirectories, Path workspace, String productName) {
this.serverDirectories = serverDirectories;
this.workspace = workspace;
@@ -218,19 +219,4 @@ public final class BlazeDirectories {
// execRoot is derivable from other fields, but better safe than sorry.
&& this.execRoot.equals(that.execRoot);
}
-
- void serialize(CodedOutputStream codedOut, PathCodec pathCodec)
- throws IOException, SerializationException {
- serverDirectories.serialize(codedOut, pathCodec);
- pathCodec.serialize(workspace, codedOut);
- StringCodecs.asciiOptimized().serialize(productName, codedOut);
- }
-
- static BlazeDirectories deserialize(CodedInputStream codedIn, PathCodec pathCodec)
- throws IOException, SerializationException {
- return new BlazeDirectories(
- ServerDirectories.deserialize(codedIn, pathCodec),
- pathCodec.deserialize(codedIn),
- StringCodecs.asciiOptimized().deserialize(codedIn));
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
deleted file mode 100644
index cf9e65e1ef..0000000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.analysis;
-
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.vfs.PathCodec;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
-
-/**
- * {@link ObjectCodec} for {@link BlazeDirectories}. Delegates to {@link BlazeDirectories} for
- * everything.
- */
-public class BlazeDirectoriesCodec implements ObjectCodec<BlazeDirectories> {
- private final PathCodec pathCodec;
-
- public BlazeDirectoriesCodec(PathCodec pathCodec) {
- this.pathCodec = pathCodec;
- }
-
- @Override
- public Class<BlazeDirectories> getEncodedClass() {
- return BlazeDirectories.class;
- }
-
- @Override
- public void serialize(BlazeDirectories obj, CodedOutputStream codedOut)
- throws IOException, SerializationException {
- obj.serialize(codedOut, pathCodec);
- }
-
- @Override
- public BlazeDirectories deserialize(CodedInputStream codedIn)
- throws IOException, SerializationException {
- return BlazeDirectories.deserialize(codedIn, pathCodec);
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java
index 69a0f0875b..bb816a71a7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java
@@ -16,16 +16,18 @@ package com.google.devtools.build.lib.analysis;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.PlatformOptions.ToolchainResolutionOverride;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety;
+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.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import java.util.List;
/** A configuration fragment describing the current platform configuration. */
+@AutoCodec
@ThreadSafety.Immutable
@SkylarkModule(
name = "platform",
@@ -33,6 +35,8 @@ import java.util.List;
category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
)
public class PlatformConfiguration extends BuildConfiguration.Fragment {
+ public static final ObjectCodec<PlatformConfiguration> CODEC =
+ new PlatformConfiguration_AutoCodec();
private final Label executionPlatform;
private final ImmutableList<Label> targetPlatforms;
@@ -40,28 +44,18 @@ public class PlatformConfiguration extends BuildConfiguration.Fragment {
private final ImmutableMap<Label, Label> toolchainResolutionOverrides;
private final ImmutableList<Label> enabledToolchainTypes;
- public PlatformConfiguration(
+ @AutoCodec.Constructor
+ PlatformConfiguration(
Label executionPlatform,
- List<Label> targetPlatforms,
- List<Label> extraToolchains,
- List<ToolchainResolutionOverride> overrides,
- List<Label> enabledToolchainTypes) {
-
+ ImmutableList<Label> targetPlatforms,
+ ImmutableList<Label> extraToolchains,
+ ImmutableMap<Label, Label> toolchainResolutionOverrides,
+ ImmutableList<Label> enabledToolchainTypes) {
this.executionPlatform = executionPlatform;
- this.targetPlatforms = ImmutableList.copyOf(targetPlatforms);
- this.extraToolchains = ImmutableList.copyOf(extraToolchains);
- this.toolchainResolutionOverrides = convertOverrides(overrides);
- this.enabledToolchainTypes = ImmutableList.copyOf(enabledToolchainTypes);
- }
-
- private static ImmutableMap<Label, Label> convertOverrides(
- List<ToolchainResolutionOverride> overrides) {
- ImmutableMap.Builder<Label, Label> builder = new ImmutableMap.Builder<>();
- for (ToolchainResolutionOverride override : overrides) {
- builder.put(override.toolchainType(), override.toolchainLabel());
- }
-
- return builder.build();
+ this.targetPlatforms = targetPlatforms;
+ this.extraToolchains = extraToolchains;
+ this.toolchainResolutionOverrides = toolchainResolutionOverrides;
+ this.enabledToolchainTypes = enabledToolchainTypes;
}
@SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
index 6159ee4697..6a1b5c2cb3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
@@ -14,7 +14,10 @@
package com.google.devtools.build.lib.analysis;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.PlatformOptions.ToolchainResolutionOverride;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment;
@@ -22,6 +25,7 @@ import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactor
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.cmdline.Label;
+import java.util.List;
/** A loader that creates {@link PlatformConfiguration} instances based on command-line options. */
public class PlatformConfigurationLoader implements ConfigurationFragmentFactory {
@@ -46,12 +50,20 @@ public class PlatformConfigurationLoader implements ConfigurationFragmentFactory
throws InvalidConfigurationException {
// TODO(katre): This will change with remote execution.
Label executionPlatform = options.hostPlatform;
-
return new PlatformConfiguration(
executionPlatform,
- options.platforms,
- options.extraToolchains,
- options.toolchainResolutionOverrides,
- options.enabledToolchainTypes);
+ ImmutableList.copyOf(options.platforms),
+ ImmutableList.copyOf(options.extraToolchains),
+ convertOverrides(options.toolchainResolutionOverrides),
+ ImmutableList.copyOf(options.enabledToolchainTypes));
+ }
+
+ private static ImmutableMap<Label, Label> convertOverrides(
+ List<ToolchainResolutionOverride> overrides) {
+ ImmutableMap.Builder<Label, Label> builder = new ImmutableMap.Builder<>();
+ for (ToolchainResolutionOverride override : overrides) {
+ builder.put(override.toolchainType(), override.toolchainLabel());
+ }
+ return builder.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index 788e3abfd1..c653c8c9ba 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -19,12 +19,10 @@ import com.google.common.base.Strings;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+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.vfs.FileSystemProvider;
import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathCodec;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
import java.util.Objects;
import javax.annotation.Nullable;
@@ -35,8 +33,12 @@ import javax.annotation.Nullable;
* <p>The <code>installBase</code> is the directory where the Blaze binary has been installed. The
* <code>outputBase</code> is the directory below which Blaze puts all its state.
*/
+@AutoCodec(dependency = FileSystemProvider.class)
@Immutable
public final class ServerDirectories {
+ public static final InjectingObjectCodec<ServerDirectories, FileSystemProvider> CODEC =
+ new ServerDirectories_AutoCodec();
+
/** Where Blaze gets unpacked. */
private final Path installBase;
/** The content hash of everything in installBase. */
@@ -51,7 +53,8 @@ public final class ServerDirectories {
Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5)));
}
- private ServerDirectories(Path installBase, Path outputBase, HashCode installMD5) {
+ @AutoCodec.Constructor
+ ServerDirectories(Path installBase, Path outputBase, HashCode installMD5) {
this.installBase = installBase;
this.outputBase = outputBase;
this.installMD5 = installMD5;
@@ -111,25 +114,4 @@ public final class ServerDirectories {
&& Objects.equals(this.installMD5, that.installMD5)
&& this.outputBase.equals(that.outputBase);
}
-
- void serialize(CodedOutputStream out, PathCodec pathCodec)
- throws IOException, SerializationException {
- pathCodec.serialize(installBase, out);
- out.writeBoolNoTag(installMD5 != null);
- if (installMD5 != null) {
- out.writeByteArrayNoTag(installMD5.asBytes());
- }
- pathCodec.serialize(outputBase, out);
- }
-
- static ServerDirectories deserialize(CodedInputStream in, PathCodec pathCodec)
- throws IOException, SerializationException {
- Path installBase = pathCodec.deserialize(in);
- HashCode installMd5 = null;
- if (in.readBool()) {
- installMd5 = HashCode.fromBytes(in.readByteArray());
- }
- Path outputBase = pathCodec.deserialize(in);
- return new ServerDirectories(installBase, outputBase, installMd5);
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 9ddd66e29d..c9abccc7d1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -54,14 +54,18 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
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.util.Fingerprint;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.RegexFilter;
+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.common.options.Converter;
@@ -73,6 +77,9 @@ import com.google.devtools.common.options.OptionEffectTag;
import com.google.devtools.common.options.OptionMetadataTag;
import com.google.devtools.common.options.OptionsParsingException;
import com.google.devtools.common.options.TriState;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -112,6 +119,9 @@ import javax.annotation.Nullable;
doc = "Data required for the analysis of a target that comes from targets that "
+ "depend on it and not targets that it depends on.")
public class BuildConfiguration implements BuildEvent {
+ public static final InjectingObjectCodec<BuildConfiguration, FileSystemProvider> CODEC =
+ new BuildConfigurationCodec();
+
/**
* Sorts fragments by class name. This produces a stable order which, e.g., facilitates consistent
* output from buildMnemonic.
@@ -129,7 +139,11 @@ public class BuildConfiguration implements BuildEvent {
* declare {@link ImmutableList} signatures on their interfaces vs. {@link List}). This is because
* fragment instances may be shared across configurations.
*/
+ @AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC, dependency = FileSystemProvider.class)
public abstract static class Fragment {
+ public static final InjectingObjectCodec<Fragment, FileSystemProvider> CODEC =
+ new BuildConfiguration_Fragment_AutoCodec();
+
/**
* Validates the options for this Fragment. Issues warnings for the
* use of deprecated options, and warnings or errors for any option settings
@@ -1100,6 +1114,7 @@ public class BuildConfiguration implements BuildEvent {
private final ImmutableSortedMap<Class<? extends Fragment>, Fragment> fragments;
private final ImmutableMap<String, Class<? extends Fragment>> skylarkVisibleFragments;
+ private final String repositoryName;
private final RepositoryName mainRepositoryName;
private final ImmutableSet<String> reservedActionMnemonics;
@@ -1377,7 +1392,7 @@ public class BuildConfiguration implements BuildEvent {
this.fragments = makeFragmentsMap(fragmentsMap);
this.skylarkVisibleFragments = buildIndexOfSkylarkVisibleFragments();
-
+ this.repositoryName = repositoryName;
this.buildOptions = buildOptions.clone();
this.actionsEnabled = buildOptions.enableActions();
this.options = buildOptions.get(Options.class);
@@ -2152,4 +2167,41 @@ public class BuildConfiguration implements BuildEvent {
.setCpu(getCpu());
return GenericBuildEvent.protoChaining(this).setConfiguration(builder.build()).build();
}
+
+ private static class BuildConfigurationCodec
+ implements InjectingObjectCodec<BuildConfiguration, FileSystemProvider> {
+ @Override
+ public Class<BuildConfiguration> getEncodedClass() {
+ return BuildConfiguration.class;
+ }
+
+ @Override
+ public void serialize(
+ FileSystemProvider fsProvider, BuildConfiguration obj, CodedOutputStream codedOut)
+ throws SerializationException, IOException {
+ BlazeDirectories.CODEC.serialize(fsProvider, obj.directories, codedOut);
+ codedOut.writeInt32NoTag(obj.fragments.size());
+ for (Fragment fragment : obj.fragments.values()) {
+ Fragment.CODEC.serialize(fsProvider, fragment, codedOut);
+ }
+ BuildOptions.CODEC.serialize(obj.buildOptions, codedOut);
+ StringCodecs.asciiOptimized().serialize(obj.repositoryName, codedOut);
+ }
+
+ @Override
+ public BuildConfiguration deserialize(FileSystemProvider fsProvider, CodedInputStream codedIn)
+ throws SerializationException, IOException {
+ BlazeDirectories blazeDirectories = BlazeDirectories.CODEC.deserialize(fsProvider, codedIn);
+ int length = codedIn.readInt32();
+ ImmutableSortedMap.Builder<Class<? extends Fragment>, Fragment> builder =
+ new ImmutableSortedMap.Builder<>(lexicalFragmentSorter);
+ for (int i = 0; i < length; ++i) {
+ Fragment fragment = Fragment.CODEC.deserialize(fsProvider, codedIn);
+ builder.put(fragment.getClass(), fragment);
+ }
+ BuildOptions options = BuildOptions.CODEC.deserialize(codedIn);
+ String repositoryName = StringCodecs.asciiOptimized().deserialize(codedIn);
+ return new BuildConfiguration(blazeDirectories, builder.build(), options, repositoryName);
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
index 8389422fa6..b3099ca49d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
@@ -21,6 +21,9 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+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.vfs.FileSystemProvider;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -28,13 +31,15 @@ import java.io.Serializable;
import java.util.Objects;
import java.util.Set;
-/**
- * A Skyframe value representing a {@link BuildConfiguration}.
- */
+/** A Skyframe value representing a {@link BuildConfiguration}. */
// TODO(bazel-team): mark this immutable when BuildConfiguration is immutable.
// @Immutable
+@AutoCodec(dependency = FileSystemProvider.class)
@ThreadSafe
public class BuildConfigurationValue implements SkyValue {
+ public static final InjectingObjectCodec<BuildConfigurationValue, FileSystemProvider> CODEC =
+ new BuildConfigurationValue_AutoCodec();
+
private static final Interner<Key> keyInterner = BlazeInterners.newWeakInterner();
private final BuildConfiguration configuration;