diff options
author | Matthew DeVore <matvore@google.com> | 2015-02-20 15:48:41 +0000 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-20 15:48:41 +0000 |
commit | 344bcbc4a2b4ca6f76b0b43929c0d8f0a3cc2662 (patch) | |
tree | c94fdbc893d38b454f81cdb5273ac7133e437ace /src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java | |
parent | 254aee40df78e79ac1b19fe6d20ae20bb05129a8 (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.java | 102 |
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 -->*/ |