aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-04-13 21:02:56 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-04-14 07:38:31 +0000
commit8bc763ce9570faa98c4dd3db3c8d261b47cad279 (patch)
tree387bcd68be6213ff99052f9eb7506f3fc1ff1d77 /src/main/java/com/google/devtools
parentf0a18846461d4b7ecc76c36a659ff1e37f93d7dc (diff)
Make ObjcProvider keys accessible to skylark. This is necessary to allow
skylark native access to ObjcProvider instances. -- MOS_MIGRATED_REVID=119782586
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java246
5 files changed, 302 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 371db1c875..ef0bca705c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -98,6 +98,7 @@ import com.google.devtools.build.lib.rules.java.JavaOptions;
import com.google.devtools.build.lib.rules.java.JavaToolchainRule;
import com.google.devtools.build.lib.rules.java.JvmConfigurationLoader;
import com.google.devtools.build.lib.rules.java.ProguardLibraryRule;
+import com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon;
import com.google.devtools.build.lib.rules.objc.AppleWatch1ExtensionRule;
import com.google.devtools.build.lib.rules.objc.AppleWatchExtensionBinaryRule;
import com.google.devtools.build.lib.rules.objc.ExperimentalObjcLibraryRule;
@@ -235,9 +236,8 @@ public class BazelRuleClassProvider {
public static final ImmutableMap<String, SkylarkType> skylarkBuiltinJavaObects =
ImmutableMap.of(
"android_common", SkylarkType.of(AndroidSkylarkCommon.class),
- "apple_toolchain", SkylarkType.of(AppleToolchain.class));
-
-
+ "apple_common", SkylarkType.of(AppleSkylarkCommon.class));
+
public static void setup(ConfiguredRuleClassProvider.Builder builder) {
builder
.addBuildInfoFactory(new BazelJavaBuildInfoFactory())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
index 99d31f2272..8b87724368 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
@@ -44,6 +44,7 @@ import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBu
doc = "Utilities for resolving items from the Apple toolchain."
)
public class AppleToolchain {
+
// These next two strings are shared secrets with the xcrunwrapper.sh to allow
// expansion of DeveloperDir and SDKRoot and runtime, since they aren't known
// until compile time on any given build machine.
@@ -78,10 +79,6 @@ public class AppleToolchain {
.put("GCC_WARN_UNUSED_VARIABLE", "-Wunused-variable")
.build();
- private AppleToolchain() {
- throw new UnsupportedOperationException("static-only");
- }
-
/**
* Returns the platform plist name (for example, iPhoneSimulator) for the platform corresponding
* to the value of {@code --ios_cpu} in the given configuration.
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
new file mode 100644
index 0000000000..4de5488e59
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -0,0 +1,46 @@
+// Copyright 2016 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.devtools.build.lib.rules.apple.AppleToolchain;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * A class that exposes apple rule implementation internals to skylark.
+ */
+@SkylarkModule(
+ name = "apple_common",
+ doc = "Functions for skylark to access internals of the apple rule implementations."
+)
+public class AppleSkylarkCommon {
+
+ @SkylarkCallable(
+ name = "apple_toolchain",
+ doc = "Utilities for resolving items from the apple toolchain."
+ )
+ public static AppleToolchain getAppleToolchain() {
+ return new AppleToolchain();
+ }
+
+ @SkylarkCallable(
+ name = "keys",
+ doc = "Retrieves ObjcProvider keys"
+ )
+ public static SkylarkKeyStore getKeys() {
+ return new SkylarkKeyStore();
+ }
+}
+
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 99968e924c..5a33f69e30 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -28,6 +28,8 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.util.Preconditions;
@@ -64,6 +66,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
* Represents one of the things this provider can provide transitively. Things are provided as
* {@link NestedSet}s of type E.
*/
+ @SkylarkModule(name = "Key", doc = "An ObjcProvider key.")
public static class Key<E> {
private final Order order;
private final String skylarkKeyName;
@@ -78,6 +81,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
/**
* Returns the name of the collection represented by this key in the Skylark provider.
*/
+ @SkylarkCallable(name = "name", structField = true)
public String getSkylarkKeyName() {
return skylarkKeyName;
}
@@ -331,18 +335,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
HAS_WATCH1_EXTENSION
}
- /**
- * All keys in ObjcProvider that will be passed in the corresponding Skylark provider.
- */
- // Only keys for Artifact or primitive types can be in the Skylark provider, as other types
- // are not supported as Skylark types.
- private static final ImmutableList<Key<?>> KEYS_FOR_SKYLARK =
- ImmutableList.<Key<?>>of(LIBRARY, IMPORTED_LIBRARY, LINKED_BINARY, FORCE_LOAD_LIBRARY,
- FORCE_LOAD_FOR_XCODEGEN, HEADER, SOURCE, DEFINE, ASSET_CATALOG, GENERAL_RESOURCE_FILE,
- SDK_DYLIB, XCDATAMODEL, MODULE_MAP, MERGE_ZIP, FRAMEWORK_FILE, DEBUG_SYMBOLS,
- DEBUG_SYMBOLS_PLIST, BREAKPAD_FILE, STORYBOARD, XIB, STRINGS, LINKOPT, J2OBJC_LIBRARY,
- ROOT_MERGE_ZIP);
-
private final ImmutableMap<Key<?>, NestedSet<?>> items;
// Items which should be passed to direct dependers, but not transitive dependers.
@@ -392,7 +384,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
*/
public SkylarkClassObject toSkylarkProvider() {
ImmutableMap.Builder<String, Object> providerBuilder = ImmutableMap.<String, Object>builder();
- for (Key<?> key : KEYS_FOR_SKYLARK) {
+ for (Key<?> key : SkylarkKeyStore.KEYS_FOR_SKYLARK) {
providerBuilder.put(key.getSkylarkKeyName(), new SkylarkNestedSet(key.getType(), get(key)));
}
return new SkylarkClassObject(providerBuilder.build(), "No such attribute '%s'");
@@ -405,7 +397,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
*/
public static ObjcProvider fromSkylarkProvider(SkylarkClassObject skylarkProvider) {
Builder builder = new Builder();
- for (Key<?> key : KEYS_FOR_SKYLARK) {
+ for (Key<?> key : SkylarkKeyStore.KEYS_FOR_SKYLARK) {
SkylarkNestedSet skylarkSet =
(SkylarkNestedSet) skylarkProvider.getValue(key.getSkylarkKeyName());
if (skylarkSet != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java b/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java
new file mode 100644
index 0000000000..0b99bdcdc1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java
@@ -0,0 +1,246 @@
+// Copyright 2016 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.ImmutableList;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * A container for valid ObjcProvider keys, to be provided to skylark.
+ */
+@SkylarkModule(
+ name = "objc_provider_keys_store",
+ doc = "A container for valid ObjcProvider keys."
+)
+public class SkylarkKeyStore {
+
+ @SkylarkCallable(
+ name = "library",
+ doc = "Returns a key that gives libraries in this target"
+ )
+ public static Key<Artifact> getLibrary() {
+ return ObjcProvider.LIBRARY;
+ }
+
+ @SkylarkCallable(
+ name = "imported_library",
+ doc = "Returns a key that gives imported libraries in this target"
+ )
+ public static Key<Artifact> getImportedLibrary() {
+ return ObjcProvider.IMPORTED_LIBRARY;
+ }
+
+ @SkylarkCallable(
+ name = "linked_binary",
+ doc = "Returns a key that gives single-architecture linked binaries to "
+ + "be combined into a multi-architecture binary"
+ )
+ public static Key<Artifact> getLinkedBinary() {
+ return ObjcProvider.LINKED_BINARY;
+ }
+
+ @SkylarkCallable(
+ name = "force_load_library",
+ doc = "Returns a key that gives libraries to laod with the "
+ + "'-force_load' flag."
+ )
+ public static Key<Artifact> getForceLoadLibrary() {
+ return ObjcProvider.FORCE_LOAD_LIBRARY;
+ }
+
+ @SkylarkCallable(
+ name = "header",
+ doc = "Returns a key that gives all header files."
+ )
+ public static Key<Artifact> getHeader() {
+ return ObjcProvider.HEADER;
+ }
+
+ @SkylarkCallable(
+ name = "source",
+ doc = "Returns a key that gives all source files."
+ )
+ public static Key<Artifact> getSource() {
+ return ObjcProvider.SOURCE;
+ }
+
+ @SkylarkCallable(
+ name = "define",
+ doc = "Returns a key that gives all values in 'defines' attributes."
+ )
+ public static Key<String> getDefine() {
+ return ObjcProvider.DEFINE;
+ }
+
+ @SkylarkCallable(
+ name = "asset_catalog",
+ doc = "Returns the 'ASSET_CATALOG' key."
+ )
+ public static Key<Artifact> getAssetCatalog() {
+ return ObjcProvider.ASSET_CATALOG;
+ }
+
+ @SkylarkCallable(
+ name = "sdk_dylib",
+ doc = "Returns the 'SDK_DYLIB' key."
+ )
+ public static Key<String> getSdkDylib() {
+ return ObjcProvider.SDK_DYLIB;
+ }
+
+ @SkylarkCallable(
+ name = "xcdatamodel",
+ doc = "Returns the 'XCDATAMODEL' key."
+ )
+ public static Key<Artifact> getXcDataModel() {
+ return ObjcProvider.XCDATAMODEL;
+ }
+
+ @SkylarkCallable(
+ name = "module_map",
+ doc = "Returns a key that gives clang module maps."
+ )
+ public static Key<Artifact> getModuleMap() {
+ return ObjcProvider.MODULE_MAP;
+ }
+
+ @SkylarkCallable(
+ name = "merge_zip",
+ doc = "Returns a key that gives zips to include in the bundle."
+ )
+ public static Key<Artifact> getMergeZip() {
+ return ObjcProvider.MERGE_ZIP;
+ }
+
+ @SkylarkCallable(
+ name = "root_merge_zip",
+ doc = "Returns a key that gives zips to include outside the bundle."
+ )
+ public static Key<Artifact> getRootMergeZip() {
+ return ObjcProvider.ROOT_MERGE_ZIP;
+ }
+
+ @SkylarkCallable(
+ name = "framework_file",
+ doc = "Returns a key that gives .framework files to be included in "
+ + "compilation and linking."
+ )
+ public static Key<Artifact> getFrameworkFile() {
+ return ObjcProvider.FRAMEWORK_FILE;
+ }
+
+ @SkylarkCallable(
+ name = "debug_symbols",
+ doc = "Returns a key that gives an artifact containing debug symbol "
+ + "information."
+ )
+ public static Key<Artifact> getDebugSymbols() {
+ return ObjcProvider.DEBUG_SYMBOLS;
+ }
+
+ @SkylarkCallable(
+ name = "debug_symbols_plist",
+ doc = "Returns a key that gives an artifact containing the plist "
+ + "on debug symbols."
+ )
+ public static Key<Artifact> getDebugSymbolsPlist() {
+ return ObjcProvider.DEBUG_SYMBOLS_PLIST;
+ }
+
+ @SkylarkCallable(
+ name = "breakpad_file",
+ doc = "Returns a key that gives the generated breakpad file for crash "
+ + "reporting."
+ )
+ public static Key<Artifact> getBreakpadFile() {
+ return ObjcProvider.BREAKPAD_FILE;
+ }
+
+ @SkylarkCallable(
+ name = "storyboard",
+ doc = "Returns a key that gives artifacts for storyboard sources."
+ )
+ public static Key<Artifact> getStoryboard() {
+ return ObjcProvider.STORYBOARD;
+ }
+
+ @SkylarkCallable(
+ name = "xib",
+ doc = "Returns a key that gives artifacts for .xib file sources."
+ )
+ public static Key<Artifact> getXib() {
+ return ObjcProvider.XIB;
+ }
+
+ @SkylarkCallable(
+ name = "strings",
+ doc = "Returns a key that gives artifacts for strings source files."
+ )
+ public static Key<Artifact> getStrings() {
+ return ObjcProvider.STRINGS;
+ }
+
+ @SkylarkCallable(
+ name = "linkopt",
+ doc = "Returns a key that gives linking options from dependencies."
+ )
+ public static Key<String> getLinkopt() {
+ return ObjcProvider.LINKOPT;
+ }
+
+ @SkylarkCallable(
+ name = "j2objc_library",
+ doc = "Returns a key that gives static libraries that are built from "
+ + "J2ObjC-translated Java code."
+ )
+ public static Key<Artifact> getJ2ObjcLibrary() {
+ return ObjcProvider.J2OBJC_LIBRARY;
+ }
+
+ /**
+ * All keys in ObjcProvider that will be passed in the corresponding Skylark provider.
+ */
+ // Only keys for Artifact or primitive types can be in the Skylark provider, as other types
+ // are not supported as Skylark types.
+ // Note: This list is only required to support objcprovider <-> skylarkprovider conversion, which
+ // will be removed in favor of native skylark ObjcProvider access once that is implemented.
+ static final ImmutableList<ObjcProvider.Key<?>> KEYS_FOR_SKYLARK =
+ ImmutableList.<ObjcProvider.Key<?>>of(
+ ObjcProvider.LIBRARY,
+ ObjcProvider.IMPORTED_LIBRARY,
+ ObjcProvider.LINKED_BINARY,
+ ObjcProvider.FORCE_LOAD_LIBRARY,
+ ObjcProvider.HEADER,
+ ObjcProvider.SOURCE,
+ ObjcProvider.DEFINE,
+ ObjcProvider.ASSET_CATALOG,
+ ObjcProvider.SDK_DYLIB,
+ ObjcProvider.XCDATAMODEL,
+ ObjcProvider.MODULE_MAP,
+ ObjcProvider.MERGE_ZIP,
+ ObjcProvider.FRAMEWORK_FILE,
+ ObjcProvider.DEBUG_SYMBOLS,
+ ObjcProvider.DEBUG_SYMBOLS_PLIST,
+ ObjcProvider.BREAKPAD_FILE,
+ ObjcProvider.STORYBOARD,
+ ObjcProvider.XIB,
+ ObjcProvider.STRINGS,
+ ObjcProvider.LINKOPT,
+ ObjcProvider.J2OBJC_LIBRARY,
+ ObjcProvider.ROOT_MERGE_ZIP);
+}