// Copyright 2015 The Bazel Authors. 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.BuildType.LABEL; import com.google.devtools.build.lib.analysis.BaseRuleClasses; 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; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.IpaRule; /** * Rule definition for ios_extension. */ public class IosExtensionRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) /*
name.ipa
: the extension bundle as an .ipa
filename.xcodeproj/project.pbxproj
: An Xcode project file which
can be used to develop or build on a Mac.This rule produces a bundled binary for an iOS app extension from a compiled binary and bundle metadata.
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 .ipa
with only the extension.
Bundles generated by this rule use a bundle directory called
PlugIns/target-name.appex
, while an application bundle uses
Payload/target-name.app
. For instance, if an application call Foo has an app
extension called Bar, the Bar extension bundle files will be stored in
Payload/Foo.app/PlugIns/Bar.appex
in the final application .ipa
.
There are many similarities between app extensions and applications with little to no difference between how each thing is processed:
-e _NSExtensionMain
- sets the entry point to a standard function in the
iOS runtime rather than main()
-fapplicationextension