aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-04-22 22:18:30 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-04-25 09:09:49 +0000
commit49acce8a027252585d61e2c82f7298acad9da77a (patch)
treec3cf4311f05cbb7123daa9b266c99d0be3d12373 /src
parent8dba2b22f684a2fdbacce6d4c3c1fb593e897069 (diff)
Always output entitlements plist in the XML format
Adding --extra_entitlements flag to a build triggers a merge of entitlements files using plmerge tool. Configure build rules to output the resulting plist file in the XML format. Bundles signed with entitlements in the binary format fail to load on device. -- MOS_MIGRATED_REVID=120588271
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/PlMergeControlBytes.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java2
-rw-r--r--src/main/protobuf/plmerge.proto11
-rw-r--r--src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java16
-rw-r--r--src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlistMerging.java13
5 files changed, 71 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/PlMergeControlBytes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/PlMergeControlBytes.java
index 548f6b6d04..fc0450582c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/PlMergeControlBytes.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/PlMergeControlBytes.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.rules.objc;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.ByteSource;
import com.google.devtools.build.lib.actions.Artifact;
@@ -41,6 +42,7 @@ public final class PlMergeControlBytes extends ByteSource {
@Nullable private final Map<String, String> variableSubstitutions;
@Nullable private final String executableName;
private final Artifact mergedPlist;
+ private final OutputFormat outputFormat;
/**
* Creates a control based on the passed bundling's plists and values.
@@ -64,13 +66,17 @@ public final class PlMergeControlBytes extends ByteSource {
bundling.getFallbackBundleId(),
bundling.variableSubstitutions(),
bundling.getName(),
- mergedPlist);
+ mergedPlist,
+ OutputFormat.BINARY);
}
/**
* Creates a control that merges the given plists into the merged plist.
*/
- static PlMergeControlBytes fromPlists(NestedSet<Artifact> inputPlists, Artifact mergedPlist) {
+ static PlMergeControlBytes fromPlists(
+ NestedSet<Artifact> inputPlists,
+ Artifact mergedPlist,
+ OutputFormat outputFormat) {
return new PlMergeControlBytes(
inputPlists,
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
@@ -78,7 +84,8 @@ public final class PlMergeControlBytes extends ByteSource {
null,
ImmutableMap.<String, String>of(),
null,
- mergedPlist);
+ mergedPlist,
+ outputFormat);
}
private PlMergeControlBytes(
@@ -88,7 +95,8 @@ public final class PlMergeControlBytes extends ByteSource {
@Nullable String fallbackBundleId,
@Nullable Map<String, String> variableSubstitutions,
@Nullable String executableName,
- Artifact mergedPlist) {
+ Artifact mergedPlist,
+ OutputFormat outputFormat) {
this.inputPlists = inputPlists;
this.immutableInputPlists = immutableInputPlists;
this.primaryBundleId = primaryBundleId;
@@ -96,6 +104,7 @@ public final class PlMergeControlBytes extends ByteSource {
this.variableSubstitutions = variableSubstitutions;
this.executableName = executableName;
this.mergedPlist = mergedPlist;
+ this.outputFormat = Preconditions.checkNotNull(outputFormat);
}
@Override
@@ -123,6 +132,26 @@ public final class PlMergeControlBytes extends ByteSource {
control.setExecutableName(executableName);
}
+ control.setOutputFormat(outputFormat.getProtoOutputFormat());
+
return control.build();
}
+
+ /**
+ * Plist output formats.
+ */
+ public enum OutputFormat {
+ BINARY(Control.OutputFormat.BINARY),
+ XML(Control.OutputFormat.XML);
+
+ private final Control.OutputFormat protoOutputFormat;
+
+ private OutputFormat(Control.OutputFormat protoOutputFormat) {
+ this.protoOutputFormat = protoOutputFormat;
+ }
+
+ Control.OutputFormat getProtoOutputFormat() {
+ return protoOutputFormat;
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
index 69ad78fc9e..8068f3a522 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
@@ -549,7 +549,7 @@ public final class ReleaseBundlingSupport {
PlMergeControlBytes controlBytes =
PlMergeControlBytes.fromPlists(
NestedSetBuilder.create(Order.STABLE_ORDER, substitutedEntitlements, extraEntitlements),
- intermediateArtifacts.entitlements());
+ intermediateArtifacts.entitlements(), PlMergeControlBytes.OutputFormat.XML);
Artifact plMergeControlArtifact = ObjcRuleClasses.artifactByAppendingToBaseName(ruleContext,
artifactName(".merge-entitlements-control"));
diff --git a/src/main/protobuf/plmerge.proto b/src/main/protobuf/plmerge.proto
index 14eef6c524..d26c712092 100644
--- a/src/main/protobuf/plmerge.proto
+++ b/src/main/protobuf/plmerge.proto
@@ -19,8 +19,14 @@ option java_package = "com.google.devtools.build.xcode.plmerge.proto";
// Contains necessary arguments for PlMerge, which is responsible for merging
// plist files.
-// Next Id: 8
+// Next Id: 9
message Control {
+ // Formats that plmerge can output to.
+ enum OutputFormat {
+ BINARY = 1;
+ XML = 2;
+ }
+
// Paths to the plist files to merge relative to execution root.
repeated string source_file = 1;
@@ -32,6 +38,9 @@ message Control {
// Path to the output file to merge relative to execution root.
required string out_file = 2;
+ // Output format of the resulting plist file.
+ optional OutputFormat output_format = 8 [default = BINARY];
+
// Key-value substitutions to support templating for plists. A substitution
// is made if the substitution key appears as a value for any key-value pair
// in any source_file.
diff --git a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
index c204e2f53d..8f9f558938 100644
--- a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
+++ b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
@@ -27,6 +27,7 @@ import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
+import java.nio.file.Path;
/**
* Entry point for the {@code plmerge} tool, which merges the data from one or more plists into a
@@ -75,7 +76,20 @@ public class PlMerge {
// This prevents CFBundleIdentifiers being put into strings files.
merging.setBundleIdentifier(primaryBundleId, fallbackBundleId);
}
- merging.writePlist(fileSystem.getPath(control.getOutFile()));
+
+ Path outputPath = fileSystem.getPath(control.getOutFile());
+ switch (control.getOutputFormat()) {
+ case BINARY:
+ merging.writePlist(outputPath);
+ break;
+ case XML:
+ merging.writeXmlPlist(outputPath);
+ break;
+ default:
+ throw new IllegalArgumentException(String.format(
+ "Unknown output format in the control file: %s",
+ control.getOutputFormat()));
+ }
}
private static void validateControl(Control control) {
diff --git a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlistMerging.java b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlistMerging.java
index 0463039fac..b292a65bd1 100644
--- a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlistMerging.java
+++ b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlistMerging.java
@@ -122,7 +122,7 @@ public class PlistMerging extends Value<PlistMerging> {
}
/**
- * Writes the results of a merge operation to a plist file.
+ * Writes the results of a merge operation to a binary plist file.
* @param plistPath the path of the plist to write in binary format
*/
public PlistMerging writePlist(Path plistPath) throws IOException {
@@ -133,6 +133,17 @@ public class PlistMerging extends Value<PlistMerging> {
}
/**
+ * Writes the results of a merge operation to an XML plist file.
+ * @param plistPath the path of the plist to write in XML format
+ */
+ public PlistMerging writeXmlPlist(Path plistPath) throws IOException {
+ try (OutputStream out = Files.newOutputStream(plistPath)) {
+ PropertyListParser.saveAsXML(merged, out);
+ }
+ return this;
+ }
+
+ /**
* Writes a PkgInfo file based on certain keys in the merged plist.
* @param pkgInfoPath the path of the PkgInfo file to write. In many iOS apps, this file just
* contains the raw string {@code APPL????}.