diff options
Diffstat (limited to 'src/main/java')
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; |