aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2017-05-10 15:04:42 -0400
committerGravatar Kristina Chodorow <kchodorow@google.com>2017-05-11 10:49:16 -0400
commit6fb61a9972f122e779b9b1489e9ce192337151ca (patch)
tree50f1b0906a1090c93ab8bb80fdefb82dae03f1b0 /src/main/java/com/google
parentd7297887c764e9a9ee906202d988bd353e5f5ecf (diff)
Create AppleDynamicFramework skylark provider.
This provider should be constructed by the skylark ios_framework rule and passed to apple_binary via the "dylibs" attribute. RELNOTES: None. PiperOrigin-RevId: 155658524
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicFrameworkProvider.java108
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java95
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);
}
}
-