diff options
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicFrameworkProvider.java | 108 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java | 95 |
2 files changed, 202 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicFrameworkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicFrameworkProvider.java new file mode 100644 index 0000000000..84d4bbc3d0 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicFrameworkProvider.java @@ -0,0 +1,108 @@ +// Copyright 2017 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 com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.packages.ClassObjectConstructor; +import com.google.devtools.build.lib.packages.NativeClassObjectConstructor; +import com.google.devtools.build.lib.packages.SkylarkClassObject; +import com.google.devtools.build.lib.vfs.PathFragment; + +/** + * Provider containing information about an Apple dynamic framework. This provider contains: + * <ul> + * <li>'framework_dirs': The framework path names used as link inputs in order to link + * against the dynamic framework</li> + * <li>'framework_files': The full set of artifacts that should be included as inputs + * to link against the dynamic framework</li> + * <li>'binary': The dylib binary artifact of the dynamic framework</li> + * <li>'objc': An {@link ObjcProvider} which contains information about the transitive + * dependencies linked into the binary, (intended so that bundle loaders depending on this + * executable may avoid relinking symbols included in the loadable binary</li> + * </ul> + */ +public final class AppleDynamicFrameworkProvider extends SkylarkClassObject + implements TransitiveInfoProvider { + + /** Skylark name for the AppleDynamicFrameworkProvider. */ + public static final String SKYLARK_NAME = "AppleDynamicFramework"; + + /** Skylark constructor and identifier for AppleDynamicFrameworkProvider. */ + public static final ClassObjectConstructor SKYLARK_CONSTRUCTOR = + new NativeClassObjectConstructor(SKYLARK_NAME) {}; + + /** Field name for the dylib binary artifact of the dynamic framework. */ + public static final String DYLIB_BINARY_FIELD_NAME = "binary"; + /** Field name for the framework path names of the dynamic framework. */ + public static final String FRAMEWORK_DIRS_FIELD_NAME = "framework_dirs"; + /** Field name for the framework link-input artifacts of the dynamic framework. */ + public static final String FRAMEWORK_FILES_FIELD_NAME = "framework_files"; + /** Field name for the {@link ObjcProvider} containing dependency information. */ + public static final String OBJC_PROVIDER_FIELD_NAME = "objc"; + + private final NestedSet<PathFragment> dynamicFrameworkDirs; + private final NestedSet<Artifact> dynamicFrameworkFiles; + private final Artifact dylibBinary; + private final ObjcProvider depsObjcProvider; + + public AppleDynamicFrameworkProvider(Artifact dylibBinary, + ObjcProvider depsObjcProvider, + NestedSet<PathFragment> dynamicFrameworkDirs, + NestedSet<Artifact> dynamicFrameworkFiles) { + super(SKYLARK_CONSTRUCTOR, ImmutableMap.<String, Object>of( + DYLIB_BINARY_FIELD_NAME, dylibBinary, + FRAMEWORK_DIRS_FIELD_NAME, dynamicFrameworkDirs, + FRAMEWORK_FILES_FIELD_NAME, dynamicFrameworkFiles, + OBJC_PROVIDER_FIELD_NAME, depsObjcProvider)); + this.dylibBinary = dylibBinary; + this.depsObjcProvider = depsObjcProvider; + this.dynamicFrameworkDirs = dynamicFrameworkDirs; + this.dynamicFrameworkFiles = dynamicFrameworkFiles; + } + + /** + * Returns the framework path names used as link inputs in order to link against the dynamic + * framework. + */ + public NestedSet<PathFragment> getDynamicFrameworkDirs() { + return dynamicFrameworkDirs; + } + + /** + * Returns the full set of artifacts that should be included as inputs to link against the + * dynamic framework. + */ + public NestedSet<Artifact> getDynamicFrameworkFiles() { + return dynamicFrameworkFiles; + } + + /** + * Returns the multi-architecture dylib binary of the dynamic framework. + */ + public Artifact getAppleDylibBinary() { + return dylibBinary; + } + + /** + * Returns the {@link ObjcProvider} which contains information about the transitive dependencies + * linked into the dylib. + */ + public ObjcProvider getDepsObjcProvider() { + return depsObjcProvider; + } +}
\ No newline at end of file diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index 6bd9554cf9..98340eb706 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -15,7 +15,11 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.ClassObjectConstructor; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -28,9 +32,14 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature; import com.google.devtools.build.lib.syntax.BuiltinFunction; +import com.google.devtools.build.lib.syntax.Runtime; import com.google.devtools.build.lib.syntax.SkylarkDict; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor; +import com.google.devtools.build.lib.vfs.PathFragment; + import java.util.Map.Entry; + import javax.annotation.Nullable; /** @@ -121,6 +130,18 @@ public class AppleSkylarkCommon { } @SkylarkCallable( + name = AppleDynamicFrameworkProvider.SKYLARK_NAME, + doc = + "Returns the provider constructor for AppleDynamicFramework. If a target propagates " + + "the AppleDynamicFramework provider, use this as the key with which to retrieve " + + "it.", + structField = true + ) + public ClassObjectConstructor getAppleDynamicFrameworkConstructor() { + return AppleDynamicFrameworkProvider.SKYLARK_CONSTRUCTOR; + } + + @SkylarkCallable( name = AppleDylibBinaryProvider.SKYLARK_NAME, doc = "Returns the provider constructor for AppleDylibBinary. If a target propagates " @@ -270,8 +291,80 @@ public class AppleSkylarkCommon { } }; + @SkylarkSignature( + name = "new_dynamic_framework_provider", + objectType = AppleSkylarkCommon.class, + returnType = AppleDynamicFrameworkProvider.class, + doc = "Creates a new AppleDynamicFramework provider instance.", + parameters = { + @Param(name = "self", type = AppleSkylarkCommon.class, doc = "The apple_common instance."), + @Param( + name = AppleDynamicFrameworkProvider.DYLIB_BINARY_FIELD_NAME, + type = Artifact.class, + named = true, + positional = false, + doc = "The dylib binary artifact of the dynamic framework." + ), + @Param( + name = AppleDynamicFrameworkProvider.OBJC_PROVIDER_FIELD_NAME, + type = ObjcProvider.class, + named = true, + positional = false, + doc = "An ObjcProvider which contains information about the transitive " + + "dependencies linked into the binary." + ), + @Param( + name = AppleDynamicFrameworkProvider.FRAMEWORK_DIRS_FIELD_NAME, + 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 = AppleDynamicFrameworkProvider.FRAMEWORK_FILES_FIELD_NAME, + type = SkylarkNestedSet.class, + generic1 = Artifact.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 static final BuiltinFunction NEW_DYNAMIC_FRAMEWORK_PROVIDER = + new BuiltinFunction("new_dynamic_framework_provider") { + @SuppressWarnings("unused") + // This method is registered statically for skylark, and never called directly. + public AppleDynamicFrameworkProvider invoke( + AppleSkylarkCommon self, + Artifact dylibBinary, + ObjcProvider depsObjcProvider, + Object dynamicFrameworkDirs, + Object dynamicFrameworkFiles) { + NestedSet<PathFragment> frameworkDirs; + if (dynamicFrameworkDirs == Runtime.NONE) { + frameworkDirs = NestedSetBuilder.<PathFragment>emptySet(Order.STABLE_ORDER); + } else { + Iterable<String> pathStrings = + ((SkylarkNestedSet) dynamicFrameworkDirs).getSet(String.class); + frameworkDirs = NestedSetBuilder.<PathFragment>stableOrder().addAll( + Iterables.transform(pathStrings, PathFragment.TO_PATH_FRAGMENT)).build(); + } + NestedSet<Artifact> frameworkFiles = dynamicFrameworkFiles != Runtime.NONE + ? ((SkylarkNestedSet) dynamicFrameworkFiles).getSet(Artifact.class) + : NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER); + return new AppleDynamicFrameworkProvider(dylibBinary, depsObjcProvider, + frameworkDirs, frameworkFiles); + } + }; + static { SkylarkSignatureProcessor.configureSkylarkFunctions(AppleSkylarkCommon.class); } } - |