diff options
Diffstat (limited to 'src')
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); +} |