diff options
author | 2017-08-17 17:49:50 +0200 | |
---|---|---|
committer | 2017-08-18 09:01:03 +0200 | |
commit | b86f8b06f5f4832b51e3be0de9d32170a79371ee (patch) | |
tree | 154fe134c52fafccd35b7e086c7076666491901d /src/main/java/com/google/devtools/build/lib/rules/apple | |
parent | 7321812d556f659b65952d5205250230e19d76cb (diff) |
Open-source Skyframe serialization, and make AppleConfiguration serializable as a pilot. Currently not hooked up to anything, but will be shortly.
PiperOrigin-RevId: 165583517
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/apple')
5 files changed, 215 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java index 36c9449462..268c47d4e7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.rules.apple; +import static com.google.devtools.build.lib.skyframe.serialization.SerializationCommonUtils.STRING_LIST_CODEC; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -24,6 +26,10 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; +import com.google.devtools.build.lib.skyframe.serialization.EnumCodec; +import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec; +import com.google.devtools.build.lib.skyframe.serialization.LabelCodec; +import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; @@ -34,6 +40,9 @@ import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionDocumentationCategory; import com.google.devtools.common.options.OptionEffectTag; import com.google.devtools.common.options.OptionMetadataTag; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; import java.util.List; /** @@ -470,6 +479,8 @@ public class AppleCommandLineOptions extends FragmentOptions { super(AppleBitcodeMode.class, "apple bitcode mode"); } } + + static final EnumCodec<AppleBitcodeMode> CODEC = new EnumCodec<>(AppleBitcodeMode.class); } @Override @@ -492,6 +503,65 @@ public class AppleCommandLineOptions extends FragmentOptions { return host; } + void serialize(CodedOutputStream out) throws IOException, SerializationException { + out.writeBoolNoTag(mandatoryMinimumVersion); + xcodeVersion.serialize(out); + iosSdkVersion.serialize(out); + watchOsSdkVersion.serialize(out); + tvOsSdkVersion.serialize(out); + macOsSdkVersion.serialize(out); + iosMinimumOs.serialize(out); + watchosMinimumOs.serialize(out); + tvosMinimumOs.serialize(out); + macosMinimumOs.serialize(out); + FastStringCodec.INSTANCE.serialize(iosCpu, out); + LabelCodec.INSTANCE.serialize(appleCrosstoolTop, out); + PlatformType.CODEC.serialize(applePlatformType, out); + FastStringCodec.INSTANCE.serialize(appleSplitCpu, out); + ConfigurationDistinguisher.CODEC.serialize(configurationDistinguisher, out); + STRING_LIST_CODEC.serialize((ImmutableList<String>) iosMultiCpus, out); + STRING_LIST_CODEC.serialize((ImmutableList<String>) watchosCpus, out); + STRING_LIST_CODEC.serialize((ImmutableList<String>) tvosCpus, out); + STRING_LIST_CODEC.serialize((ImmutableList<String>) macosCpus, out); + LabelCodec.INSTANCE.serialize(defaultProvisioningProfile, out); + LabelCodec.INSTANCE.serialize(xcodeVersionConfig, out); + FastStringCodec.INSTANCE.serialize(xcodeToolchain, out); + AppleBitcodeMode.CODEC.serialize(appleBitcodeMode, out); + out.writeBoolNoTag(enableAppleCrosstoolTransition); + out.writeBoolNoTag(targetUsesAppleCrosstool); + } + + static AppleCommandLineOptions deserialize(CodedInputStream in) + throws IOException, SerializationException { + AppleCommandLineOptions result = new AppleCommandLineOptions(); + result.mandatoryMinimumVersion = in.readBool(); + result.xcodeVersion = DottedVersion.deserialize(in); + result.iosSdkVersion = DottedVersion.deserialize(in); + result.watchOsSdkVersion = DottedVersion.deserialize(in); + result.tvOsSdkVersion = DottedVersion.deserialize(in); + result.macOsSdkVersion = DottedVersion.deserialize(in); + result.iosMinimumOs = DottedVersion.deserialize(in); + result.watchosMinimumOs = DottedVersion.deserialize(in); + result.tvosMinimumOs = DottedVersion.deserialize(in); + result.macosMinimumOs = DottedVersion.deserialize(in); + result.iosCpu = FastStringCodec.INSTANCE.deserialize(in); + result.appleCrosstoolTop = LabelCodec.INSTANCE.deserialize(in); + result.applePlatformType = PlatformType.CODEC.deserialize(in); + result.appleSplitCpu = FastStringCodec.INSTANCE.deserialize(in); + result.configurationDistinguisher = ConfigurationDistinguisher.CODEC.deserialize(in); + result.iosMultiCpus = STRING_LIST_CODEC.deserialize(in); + result.watchosCpus = STRING_LIST_CODEC.deserialize(in); + result.tvosCpus = STRING_LIST_CODEC.deserialize(in); + result.macosCpus = STRING_LIST_CODEC.deserialize(in); + result.defaultProvisioningProfile = LabelCodec.INSTANCE.deserialize(in); + result.xcodeVersionConfig = LabelCodec.INSTANCE.deserialize(in); + result.xcodeToolchain = FastStringCodec.INSTANCE.deserialize(in); + result.appleBitcodeMode = AppleBitcodeMode.CODEC.deserialize(in); + result.enableAppleCrosstoolTransition = in.readBool(); + result.targetUsesAppleCrosstool = in.readBool(); + return result; + } + /** Converter for the Apple configuration distinguisher. */ public static final class ConfigurationDistinguisherConverter extends EnumConverter<ConfigurationDistinguisher> { diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java index 3ab182ad59..b2a1a98604 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java @@ -31,13 +31,20 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions.AppleBitcodeMode; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; +import com.google.devtools.build.lib.skyframe.serialization.EnumCodec; +import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec; +import com.google.devtools.build.lib.skyframe.serialization.SerializationException; 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.Preconditions; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.annotation.Nullable; /** A configuration containing flags required for Apple platforms and tools. */ @@ -99,10 +106,11 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { @Nullable private final Label defaultProvisioningProfileLabel; private final boolean mandatoryMinimumVersion; + @VisibleForTesting AppleConfiguration( AppleCommandLineOptions options, - String cpu, - XcodeVersionProperties xcodeVersionProperties, + String iosCpu, + @Nullable DottedVersion xcodeVersion, DottedVersion iosSdkVersion, DottedVersion iosMinimumOs, DottedVersion watchosSdkVersion, @@ -126,8 +134,8 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { Preconditions.checkNotNull(macosSdkVersion, "macOsSdkVersion"); this.macosMinimumOs = Preconditions.checkNotNull(macosMinimumOs, "macOsMinimumOs"); - this.xcodeVersion = xcodeVersionProperties.getXcodeVersion().orNull(); - this.iosCpu = iosCpuFromCpu(cpu); + this.xcodeVersion = xcodeVersion; + this.iosCpu = iosCpu; this.appleSplitCpu = Preconditions.checkNotNull(options.appleSplitCpu, "appleSplitCpu"); this.applePlatformType = Preconditions.checkNotNull(options.applePlatformType, "applePlatformType"); @@ -670,6 +678,81 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { .build(); } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof AppleConfiguration)) { + return false; + } + AppleConfiguration that = (AppleConfiguration) obj; + return this.options.equals(that.options) + && Objects.equals(this.xcodeVersion, that.xcodeVersion) + && this.iosSdkVersion.equals(that.iosSdkVersion) + && this.iosMinimumOs.equals(that.iosMinimumOs) + && this.watchosSdkVersion.equals(that.watchosSdkVersion) + && this.watchosMinimumOs.equals(that.watchosMinimumOs) + && this.tvosSdkVersion.equals(that.tvosSdkVersion) + && this.tvosMinimumOs.equals(that.tvosMinimumOs) + && this.macosSdkVersion.equals(that.macosSdkVersion) + && this.macosMinimumOs.equals(that.macosMinimumOs); + } + + @Override + public int hashCode() { + return Objects.hash( + options, + xcodeVersion, + iosSdkVersion, + iosMinimumOs, + watchosSdkVersion, + watchosMinimumOs, + tvosSdkVersion, + tvosMinimumOs, + macosSdkVersion, + macosMinimumOs); + } + + void serialize(CodedOutputStream out) throws IOException, SerializationException { + options.serialize(out); + out.writeStringNoTag(iosCpu); + if (xcodeVersion == null) { + out.writeBoolNoTag(false); + } else { + out.writeBoolNoTag(true); + xcodeVersion.serialize(out); + } + iosSdkVersion.serialize(out); + iosMinimumOs.serialize(out); + watchosSdkVersion.serialize(out); + watchosMinimumOs.serialize(out); + tvosSdkVersion.serialize(out); + tvosMinimumOs.serialize(out); + macosSdkVersion.serialize(out); + macosMinimumOs.serialize(out); + } + + static AppleConfiguration deserialize(CodedInputStream in) + throws IOException, SerializationException { + AppleCommandLineOptions options = AppleCommandLineOptions.deserialize(in); + String iosCpu = FastStringCodec.INSTANCE.deserialize(in); + boolean hasXcodeVersion = in.readBool(); + DottedVersion xcodeVersion = hasXcodeVersion ? DottedVersion.deserialize(in) : null; + return new AppleConfiguration( + options, + iosCpu, + xcodeVersion, + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in), + DottedVersion.deserialize(in)); + } + /** * Loads {@link AppleConfiguration} from build options. */ @@ -701,8 +784,8 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { AppleConfiguration configuration = new AppleConfiguration( appleOptions, - cpu, - xcodeVersionProperties, + iosCpuFromCpu(cpu), + xcodeVersionProperties.getXcodeVersion().orNull(), iosSdkVersion, iosMinimumOsVersion, watchosSdkVersion, @@ -781,5 +864,8 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { public String getFileSystemName() { return fileSystemName; } + + static final EnumCodec<ConfigurationDistinguisher> CODEC = + new EnumCodec<>(ConfigurationDistinguisher.class); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java index 6be2024464..bccee16485 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.Provider; +import com.google.devtools.build.lib.skyframe.serialization.EnumCodec; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -299,5 +300,7 @@ public enum ApplePlatform implements SkylarkValue { public void repr(SkylarkPrinter printer) { printer.append(toString()); } + + static final EnumCodec<PlatformType> CODEC = new EnumCodec<>(PlatformType.class); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD index 15ae78dbf2..b6fb30189c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD @@ -14,15 +14,14 @@ java_library( "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:packages-internal", "//src/main/java/com/google/devtools/build/lib:preconditions", - "//src/main/java/com/google/devtools/build/lib:shell", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:syntax", - "//src/main/java/com/google/devtools/build/lib:vfs", - "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/skyframe/serialization", "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party:jsr305", + "//third_party/protobuf:protobuf_java", ], ) diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java index bdbc910905..5fbbef561c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java @@ -26,10 +26,14 @@ 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.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.annotation.Nullable; /** * Represents a value with multiple components, separated by periods, for example {@code 4.5.6} or @@ -249,13 +253,35 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa printer.append(stringRepresentation); } + void serialize(CodedOutputStream out) throws IOException { + out.writeInt32NoTag(components.size()); + for (Component component : components) { + component.serialize(out); + } + out.writeStringNoTag(stringRepresentation); + out.writeInt32NoTag(numOriginalComponents); + } + + static DottedVersion deserialize(CodedInputStream in) throws IOException { + int numComponents = in.readInt32(); + // TODO(janakr: Presize this if/when https://github.com/google/guava/issues/196 is resolved. + ImmutableList.Builder<Component> components = ImmutableList.builder(); + for (int i = 0; i < numComponents; i++) { + components.add(Component.deserialize(in)); + } + return new DottedVersion(components.build(), in.readString(), in.readInt32()); + } + private static final class Component implements Comparable<Component> { private final int firstNumber; - private final String alphaSequence; + @Nullable private final String alphaSequence; private final int secondNumber; private final String stringRepresentation; - public Component(int firstNumber, String alphaSequence, int secondNumber, + public Component( + int firstNumber, + @Nullable String alphaSequence, + int secondNumber, String stringRepresentation) { this.firstNumber = firstNumber; this.alphaSequence = alphaSequence; @@ -293,5 +319,25 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa public String toString() { return stringRepresentation; } + + void serialize(CodedOutputStream out) throws IOException { + if (alphaSequence == null) { + out.writeBoolNoTag(false); + } else { + out.writeBoolNoTag(true); + out.writeStringNoTag(alphaSequence); + } + out.writeInt32NoTag(firstNumber); + out.writeInt32NoTag(secondNumber); + out.writeStringNoTag(stringRepresentation); + } + + static Component deserialize(CodedInputStream in) throws IOException { + String alphaSequence = null; + if (in.readBool()) { + alphaSequence = in.readString(); + } + return new Component(in.readInt32(), alphaSequence, in.readInt32(), in.readString()); + } } } |