aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
diff options
context:
space:
mode:
authorGravatar Matthew DeVore <matvore@google.com>2015-02-20 15:48:41 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-02-20 15:48:41 +0000
commit344bcbc4a2b4ca6f76b0b43929c0d8f0a3cc2662 (patch)
treec94fdbc893d38b454f81cdb5273ac7133e437ace /src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
parent254aee40df78e79ac1b19fe6d20ae20bb05129a8 (diff)
Implement ios_extension rule. See IosExtensionRule.java for information on how app extensions are built and how they differ from application bundles.
RELNOTES: Support ios_extension and ios_extension_binary rules for creating iOS app extensions. -- MOS_MIGRATED_REVID=86788086
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
new file mode 100644
index 0000000000..a3491e0b9d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
@@ -0,0 +1,102 @@
+// Copyright 2015 Google Inc. 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.rules.objc;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.Type.LABEL;
+
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.BlazeRule;
+import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.packages.RuleClass.Builder;
+
+/**
+ * Rule definition for ios_extension.
+ */
+@BlazeRule(name = "ios_extension",
+ factoryClass = IosExtension.class,
+ ancestors = {
+ BaseRuleClasses.BaseRule.class,
+ ObjcRuleClasses.ReleaseBundlingRule.class,
+ ObjcRuleClasses.XcodegenRule.class })
+public class IosExtensionRule implements RuleDefinition {
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ return builder
+ /*<!-- #BLAZE_RULE(ios_extension).IMPLICIT_OUTPUTS -->
+ <ul>
+ <li><code><var>name</var>.ipa</code>: the extension bundle as an <code>.ipa</code>
+ file</li>
+ <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which
+ can be used to develop or build on a Mac.</li>
+ </ul>
+ <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/
+ .setImplicitOutputsFunction(
+ ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ))
+ /* <!-- #BLAZE_RULE(ios_extension).ATTRIBUTE(binary) -->
+ The binary target containing the logic for the extension.
+ ${SYNOPSIS}
+ <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
+ .add(attr("binary", LABEL)
+ .allowedRuleClasses("ios_extension_binary")
+ .allowedFileTypes()
+ .mandatory()
+ .direct_compile_time_input())
+ .build();
+ }
+}
+
+/*<!-- #BLAZE_RULE (NAME = ios_extension, TYPE = BINARY, FAMILY = Objective-C) -->
+
+${ATTRIBUTE_SIGNATURE}
+
+<p>This rule produces a bundled binary for an iOS app extension from a compiled binary and bundle
+metadata.</p>
+
+<p>An iOS app extension is a nested bundle that is located inside the application bundle and is
+released with it. An iOS app extension cannot be released alone, although this rule allows you to
+build an <code>.ipa</code> with only the extension.
+
+<p>Bundles generated by this rule use a bundle directory called
+<code>PlugIns/<var>target-name</var>.appex</code>, while an application bundle uses
+<code>Payload/<var>target-name</var>.app</code>. For instance, if an application call Foo has an app
+extension called Bar, the Bar extension bundle files will be stored in
+<code>Payload/Foo.app/PlugIns/Bar.appex</code> in the final application <code>.ipa</code>.
+
+<p>There are many similarities between app extensions and applications with little to no difference
+between how each thing is processed:
+<ul>
+ <li>both have entitlements and Info.plist files
+ <li>both are code-signed. Signing and merging happens in this order: the extension is code-signed,
+ bundles are merged, application is code-signed
+ <li>both can have an app icon and launch image, and of course asset catalogs and all kinds of
+ resources
+ <li>both have linked binaries. The app extension binary is different in that it is linked with
+ these additional flags:
+ <ul>
+ <li><code>-e _NSExtensionMain</code> - sets the entry point to a standard function in the
+ iOS runtime rather than <code>main()</code>
+ <li><code>-fapplicationextension</code>
+ </ul>
+</ul>
+
+${IMPLICIT_OUTPUTS}
+
+${ATTRIBUTE_DEFINITION}
+
+<!-- #END_BLAZE_RULE -->*/