aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/apple
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2017-08-17 17:49:50 +0200
committerGravatar Irina Iancu <elenairina@google.com>2017-08-18 09:01:03 +0200
commitb86f8b06f5f4832b51e3be0de9d32170a79371ee (patch)
tree154fe134c52fafccd35b7e086c7076666491901d /src/main/java/com/google/devtools/build/lib/rules/apple
parent7321812d556f659b65952d5205250230e19d76cb (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java70
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java98
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/ApplePlatform.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/BUILD5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java50
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());
+ }
}
}