// 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; /** * 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) /* */ .setImplicitOutputsFunction( ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ)) /* The binary target containing the logic for the extension. ${SYNOPSIS} */ .add(attr("binary", LABEL) .allowedRuleClasses("ios_extension_binary") .allowedFileTypes() .mandatory() .direct_compile_time_input() .cfg(IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION)) .build(); } @Override public Metadata getMetadata() { return RuleDefinition.Metadata.builder() .name("ios_extension") .factoryClass(IosExtension.class) .ancestors(BaseRuleClasses.BaseRule.class, ObjcRuleClasses.ReleaseBundlingRule.class, ObjcRuleClasses.XcodegenRule.class) .build(); } } /* ${ATTRIBUTE_SIGNATURE}

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:

${IMPLICIT_OUTPUTS} ${ATTRIBUTE_DEFINITION} */