diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java new file mode 100644 index 0000000000..6f547e4bf4 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java @@ -0,0 +1,371 @@ +// Copyright 2018 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.skylarkbuildapi.apple; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.skylarkbuildapi.FileApi; +import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi; +import com.google.devtools.build.lib.skylarkbuildapi.SkylarkAspectApi; +import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi; +import com.google.devtools.build.lib.skylarkbuildapi.SplitTransitionProviderApi; +import com.google.devtools.build.lib.skylarkbuildapi.StructApi; +import com.google.devtools.build.lib.skylarkbuildapi.apple.AppleStaticLibraryInfoApi.AppleStaticLibraryInfoProvider; +import com.google.devtools.build.lib.skylarkinterface.Param; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.SkylarkDict; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; + +/** + * Interface for a module with useful functions for creating apple-related rule implementations. + */ +@SkylarkModule( + name = "apple_common", + doc = "Functions for skylark to access internals of the apple rule implementations." +) +public interface AppleCommonApi<FileApiT extends FileApi, + ObjcProviderApiT extends ObjcProviderApi<?>, + XcodeConfigProviderApiT extends XcodeConfigProviderApi<?, ?>, + ApplePlatformApiT extends ApplePlatformApi> { + + @SkylarkCallable( + name = "apple_toolchain", + doc = "Utilities for resolving items from the apple toolchain." + ) + public AppleToolchainApi<?> getAppleToolchain(); + + @SkylarkCallable( + name = "platform_type", + doc = + "An enum-like struct that contains the following fields corresponding to Apple platform " + + "types:<br><ul>" + + "<li><code>ios</code></li>" + + "<li><code>macos</code></li>" + + "<li><code>tvos</code></li>" + + "<li><code>watchos</code></li>" + + "</ul><p>" + + "These values can be passed to methods that expect a platform type, like the 'apple' " + + "configuration fragment's " + + "<a href='apple.html#multi_arch_platform'>multi_arch_platform</a> method.<p>" + + "Example:<p>" + + "<pre class='language-python'>\n" + + "ctx.fragments.apple.multi_arch_platform(apple_common.platform_type.ios)\n" + + "</pre>", + structField = true + ) + public StructApi getPlatformTypeStruct(); + + @SkylarkCallable( + name = "platform", + doc = + "An enum-like struct that contains the following fields corresponding to Apple " + + "platforms:<br><ul>" + + "<li><code>ios_device</code></li>" + + "<li><code>ios_simulator</code></li>" + + "<li><code>macos</code></li>" + + "<li><code>tvos_device</code></li>" + + "<li><code>tvos_simulator</code></li>" + + "<li><code>watchos_device</code></li>" + + "<li><code>watchos_device</code></li>" + + "</ul><p>" + + "These values can be passed to methods that expect a platform, like " + + "<a href='apple.html#sdk_version_for_platform'>apple.sdk_version_for_platform</a>.", + structField = true + ) + public StructApi getPlatformStruct(); + + @SkylarkCallable( + name = "XcodeProperties", + doc = + "The constructor/key for the <code>XcodeVersionProperties</code> provider.<p>" + + "If a target propagates the <code>XcodeVersionProperties</code> provider," + + " use this as the key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.XcodeVersionProperties]\n" + + "</pre>", + structField = true + ) + public ProviderApi getXcodeVersionPropertiesConstructor(); + + @SkylarkCallable( + name = "XcodeVersionConfig", + doc = "The constructor/key for the <code>XcodeVersionConfig</code> provider.", + structField = true + ) + public ProviderApi getXcodeVersionConfigConstructor(); + + @SkylarkCallable( + // TODO(b/63899207): This currently does not match ObjcProvider.SKYLARK_NAME as it requires + // a migration of existing skylark rules. + name = "Objc", + doc = + "The constructor/key for the <code>Objc</code> provider.<p>" + + "If a target propagates the <code>Objc</code> provider, use this as the " + + "key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.Objc]\n" + + "</pre>", + structField = true + ) + public ProviderApi getObjcProviderConstructor(); + + @SkylarkCallable( + name = "AppleDynamicFramework", + doc = + "The constructor/key for the <code>AppleDynamicFramework</code> provider.<p>" + + "If a target propagates the <code>AppleDynamicFramework</code> provider, use this " + + "as the key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleDynamicFramework]\n" + + "</pre>", + structField = true + ) + public ProviderApi getAppleDynamicFrameworkConstructor(); + + @SkylarkCallable( + name = "AppleDylibBinary", + doc = + "The constructor/key for the <code>AppleDylibBinary</code> provider.<p>" + + "If a target propagates the <code>AppleDylibBinary</code> provider, use this as the " + + "key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleDylibBinary]\n" + + "</pre>", + structField = true + ) + public ProviderApi getAppleDylibBinaryConstructor(); + + @SkylarkCallable( + name = "AppleExecutableBinary", + doc = + "The constructor/key for the <code>AppleExecutableBinary</code> provider.<p>" + + "If a target propagates the <code>AppleExecutableBinary</code> provider," + + " use this as the key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleExecutableBinary]\n" + + "</pre>", + structField = true + ) + public ProviderApi getAppleExecutableBinaryConstructor(); + + @SkylarkCallable( + name = "AppleStaticLibrary", + doc = + "The constructor/key for the <code>AppleStaticLibrary</code> provider.<p>" + + "If a target propagates the <code>AppleStaticLibrary</code> provider, use " + + "this as the key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleStaticLibrary]\n" + + "</pre>", + structField = true + ) + public AppleStaticLibraryInfoProvider<?, ?> getAppleStaticLibraryProvider(); + + @SkylarkCallable( + name = "AppleDebugOutputs", + doc = + "The constructor/key for the <code>AppleDebugOutputs</code> provider.<p>" + + "If a target propagates the <code>AppleDebugOutputs</code> provider, use this as the " + + "key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleDebugOutputs]\n" + + "</pre>", + structField = true + ) + public ProviderApi getAppleDebugOutputsConstructor(); + + @SkylarkCallable( + name = "AppleLoadableBundleBinary", + doc = + "The constructor/key for the <code>AppleLoadableBundleBinary</code> provider.<p>" + + "If a target propagates the <code>AppleLoadableBundleBinary</code> provider, " + + "use this as the key with which to retrieve it. Example:<br>" + + "<pre class='language-python'>\n" + + "dep = ctx.attr.deps[0]\n" + + "p = dep[apple_common.AppleLoadableBundleBinary]\n" + + "</pre>", + structField = true + ) + public ProviderApi getAppleLoadableBundleBinaryConstructor(); + + @SkylarkCallable( + name = "apple_host_system_env", + doc = + "Returns a <a href='dict.html'>dict</a> of environment variables that should be set " + + "for actions that need to run build tools on an Apple host system, such as the " + + " version of Xcode that should be used. The keys are variable names and the values " + + " are their corresponding values." + ) + public ImmutableMap<String, String> getAppleHostSystemEnv( + XcodeConfigProviderApiT xcodeConfig); + + @SkylarkCallable( + name = "target_apple_env", + doc = + "Returns a <code>dict</code> of environment variables that should be set for actions " + + "that build targets of the given Apple platform type. For example, this dictionary " + + "contains variables that denote the platform name and SDK version with which to " + + "build. The keys are variable names and the values are their corresponding values." + ) + public ImmutableMap<String, String> getTargetAppleEnvironment( + XcodeConfigProviderApiT xcodeConfig, ApplePlatformApiT platform); + + @SkylarkCallable( + name = "multi_arch_split", + doc = "A configuration transition for rule attributes to build dependencies in one or" + + " more Apple platforms. " + + "<p>Use of this transition requires that the 'platform_type' and 'minimum_os_version'" + + " string attributes are defined and mandatory on the rule.</p>" + + "<p>The value of the platform_type attribute will dictate the target architectures " + + " for which dependencies along this configuration transition will be built.</p>" + + "<p>Options are:</p>" + + "<ul>" + + "<li><code>ios</code>: architectures gathered from <code>--ios_multi_cpus</code>.</li>" + + "<li><code>macos</code>: architectures gathered from <code>--macos_cpus</code>.</li>" + + "<li><code>tvos</code>: architectures gathered from <code>--tvos_cpus</code>.</li>" + + "<li><code>watchos</code>: architectures gathered from <code>--watchos_cpus</code>." + + "</li></ul>" + + "<p>minimum_os_version should be a dotted version string such as '7.3', and is used to" + + " set the minimum operating system on the configuration similarly based on platform" + + " type. For example, specifying platform_type 'ios' and minimum_os_version '8.0' will" + + " ensure that dependencies are built with minimum iOS version '8.0'.", + structField = true + ) + public SplitTransitionProviderApi getMultiArchSplitProvider(); + + @SkylarkCallable( + name = "new_objc_provider", + doc = "Creates a new ObjcProvider instance.", + parameters = { + @Param( + name = "uses_swift", + type = Boolean.class, + defaultValue = "False", + named = true, + positional = false, + doc = "Whether this provider should enable Swift support." + ) + }, + extraKeywords = + @Param( + name = "kwargs", + type = SkylarkDict.class, + defaultValue = "{}", + doc = "Dictionary of arguments." + ), + useEnvironment = true + ) + // This method is registered statically for skylark, and never called directly. + public ObjcProviderApi<?> newObjcProvider( + Boolean usesSwift, + SkylarkDict<?, ?> kwargs, + Environment environment); + + @SkylarkCallable( + name = "new_dynamic_framework_provider", + doc = "Creates a new AppleDynamicFramework provider instance.", + parameters = { + @Param( + name = "binary", + type = FileApi.class, + named = true, + positional = false, + doc = "The dylib binary artifact of the dynamic framework." + ), + @Param( + name = "objc", + type = ObjcProviderApi.class, + named = true, + positional = false, + doc = + "An ObjcProvider which contains information about the transitive " + + "dependencies linked into the binary." + ), + @Param( + name = "framework_dirs", + type = SkylarkNestedSet.class, + generic1 = String.class, + named = true, + noneable = true, + positional = false, + defaultValue = "None", + doc = + "The framework path names used as link inputs in order to link against the dynamic " + + "framework." + ), + @Param( + name = "framework_files", + type = SkylarkNestedSet.class, + generic1 = FileApi.class, + named = true, + noneable = true, + positional = false, + defaultValue = "None", + doc = + "The full set of artifacts that should be included as inputs to link against the " + + "dynamic framework" + ) + } + ) + public AppleDynamicFrameworkInfoApi<?, ?> newDynamicFrameworkProvider( + FileApiT dylibBinary, + ObjcProviderApiT depsObjcProvider, + Object dynamicFrameworkDirs, + Object dynamicFrameworkFiles); + + @SkylarkCallable( + name = "link_multi_arch_binary", + doc = "Links a (potentially multi-architecture) binary targeting Apple platforms. This " + + "method comprises a bulk of the logic of the <code>apple_binary</code> rule, and is " + + "exposed as an API to iterate on migration of <code>apple_binary</code> to skylark.\n" + + "<p>This API is <b>highly experimental</b> and subject to change at any time. Do not " + + "depend on the stability of this function at this time.", + mandatoryPositionals = 1 // The SkylarkRuleContext. + ) + // TODO(b/70937317): Iterate on, improve, and solidify this API. + public StructApi linkMultiArchBinary(SkylarkRuleContextApi skylarkRuleContext) + throws EvalException, InterruptedException; + + @SkylarkCallable( + name = "dotted_version", + doc = "Creates a new <a href=\"DottedVersion.html\">DottedVersion</a> instance.", + parameters = { + @Param( + name = "version", + type = String.class, + doc = "The string representation of the DottedVersion." + ) + } + ) + public DottedVersionApi<?> dottedVersion(String version); + + @SkylarkCallable( + name = "objc_proto_aspect", + doc = + "objc_proto_aspect gathers the proto dependencies of the attached rule target," + + "and propagates the proto values of its dependencies through the ObjcProto provider.", + structField = true + ) + public SkylarkAspectApi getObjcProtoAspect(); +} |