aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java76
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java177
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java246
13 files changed, 333 insertions, 363 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index a39737ce7c..be01445b3b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -21,6 +21,7 @@ import static com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClass
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
@@ -106,6 +107,9 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
private ImmutableList.Builder<Class<?>> skylarkModules =
ImmutableList.<Class<?>>builder().addAll(SkylarkModules.MODULES);
private final List<Class<? extends FragmentOptions>> buildOptions = Lists.newArrayList();
+ private ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ registeredSkylarkProviders = ImmutableBiMap.of();
+
public void addWorkspaceFilePrefix(String contents) {
defaultWorkspaceFilePrefix.append(contents);
@@ -198,6 +202,16 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
return this;
}
+ /**
+ * Registers a map that indicates which keys in structs returned by skylark rules should be
+ * interpreted as native TransitiveInfoProvider instances of type (map value).
+ */
+ public Builder setSkylarkProviderRegistry(
+ ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> providers) {
+ this.registeredSkylarkProviders = providers;
+ return this;
+ }
+
private RuleConfiguredTargetFactory createFactory(
Class<? extends RuleConfiguredTargetFactory> factoryClass) {
try {
@@ -274,7 +288,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
prerequisiteValidator,
skylarkAccessibleTopLevels,
skylarkModules.build(),
- buildOptions);
+ buildOptions,
+ registeredSkylarkProviders);
}
@Override
@@ -373,6 +388,9 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
private final Environment.Frame globals;
private final List<Class<? extends FragmentOptions>> buildOptions;
+
+ private final ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ registeredSkylarkProviders;
private ConfiguredRuleClassProvider(
Label preludeLabel,
@@ -391,7 +409,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
PrerequisiteValidator prerequisiteValidator,
ImmutableMap<String, Object> skylarkAccessibleJavaClasses,
ImmutableList<Class<?>> skylarkModules,
- List<Class<? extends FragmentOptions>> buildOptions) {
+ List<Class<? extends FragmentOptions>> buildOptions,
+ ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> registeredSkylarkProviders) {
this.preludeLabel = preludeLabel;
this.runfilesPrefix = runfilesPrefix;
this.toolsRepository = toolsRepository;
@@ -408,6 +427,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
this.prerequisiteValidator = prerequisiteValidator;
this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules);
this.buildOptions = buildOptions;
+ this.registeredSkylarkProviders = registeredSkylarkProviders;
}
public PrerequisiteValidator getPrerequisiteValidator() {
@@ -507,6 +527,19 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
}
/**
+ * Returns a map that indicates which keys in structs returned by skylark rules should be
+ * interpreted as native TransitiveInfoProvider instances of type (map value).
+ *
+ * <p>That is, if this map contains "dummy" -> DummyProvider.class, a "dummy" entry in a skylark
+ * rule implementations returned struct will be exported from that ConfiguredTarget as a
+ * DummyProvider.
+ */
+ public ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ getRegisteredSkylarkProviders() {
+ return this.registeredSkylarkProviders;
+ }
+
+ /**
* Creates a BuildOptions class for the given options taken from an optionsProvider.
*/
public BuildOptions createBuildOptions(OptionsClassProvider optionsProvider) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 06f6c87404..39a0e674ff 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -221,15 +221,21 @@ public final class ConfiguredTargetFactory {
ListMultimap<Attribute, ConfiguredTarget> prerequisiteMap,
Set<ConfigMatchingProvider> configConditions) throws InterruptedException {
// Visibility computation and checking is done for every rule.
- RuleContext ruleContext = new RuleContext.Builder(env, rule, null,
- configuration, hostConfiguration,
- ruleClassProvider.getPrerequisiteValidator(),
- rule.getRuleClassObject().getConfigurationFragmentPolicy())
- .setVisibility(convertVisibility(prerequisiteMap, env.getEventHandler(), rule, null))
- .setPrerequisites(prerequisiteMap)
- .setConfigConditions(configConditions)
- .setUniversalFragment(ruleClassProvider.getUniversalFragment())
- .build();
+ RuleContext ruleContext =
+ new RuleContext.Builder(
+ env,
+ rule,
+ null,
+ configuration,
+ hostConfiguration,
+ ruleClassProvider.getPrerequisiteValidator(),
+ rule.getRuleClassObject().getConfigurationFragmentPolicy())
+ .setVisibility(convertVisibility(prerequisiteMap, env.getEventHandler(), rule, null))
+ .setPrerequisites(prerequisiteMap)
+ .setConfigConditions(configConditions)
+ .setUniversalFragment(ruleClassProvider.getUniversalFragment())
+ .setSkylarkProvidersRegistry(ruleClassProvider.getRegisteredSkylarkProviders())
+ .build();
if (ruleContext.hasErrors()) {
return null;
}
@@ -252,7 +258,9 @@ public final class ConfiguredTargetFactory {
if (rule.getRuleClassObject().isSkylarkExecutable()) {
// TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder?
return SkylarkRuleConfiguredTargetBuilder.buildRule(
- ruleContext, rule.getRuleClassObject().getConfiguredTargetFunction());
+ ruleContext,
+ rule.getRuleClassObject().getConfiguredTargetFunction(),
+ ruleClassProvider.getRegisteredSkylarkProviders());
} else {
RuleClass.ConfiguredTargetFactory<ConfiguredTarget, RuleContext> factory =
rule.getRuleClassObject().<ConfiguredTarget, RuleContext>getConfiguredTargetFactory();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 853fdf7caf..ab7bdafd8e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -43,6 +43,7 @@ import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -124,9 +125,29 @@ public final class RuleConfiguredTargetBuilder {
add(OutputGroupProvider.class, new OutputGroupProvider(outputGroups.build()));
}
-
+ addRegisteredProvidersToSkylarkProviders();
+
return new RuleConfiguredTarget(ruleContext, skylarkProviders.build(), providers);
}
+
+ /**
+ * Adds skylark providers from a skylark provider registry, and checks for collisions.
+ */
+ private void addRegisteredProvidersToSkylarkProviders() {
+ Map<String, Object> nativeSkylarkProviders = new HashMap<>();
+ for (Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> entry :
+ providers.entrySet()) {
+ if (ruleContext.getSkylarkProviderRegistry().containsValue(entry.getKey())) {
+ String skylarkName = ruleContext.getSkylarkProviderRegistry().inverse().get(entry.getKey());
+ nativeSkylarkProviders.put(skylarkName, entry.getValue());
+ }
+ }
+ try {
+ skylarkProviders.putAll(nativeSkylarkProviders);
+ } catch (IllegalArgumentException e) {
+ ruleContext.ruleError("Collision caused by duplicate skylark providers: " + e.getMessage());
+ }
+ }
/**
* Like getFilesToBuild(), except that it also includes the runfiles middleman, if any.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 9c85ce9949..faa4f2c441 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -18,6 +18,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
@@ -151,7 +152,9 @@ public final class RuleContext extends TargetContext
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
private final Class<? extends BuildConfiguration.Fragment> universalFragment;
private final ErrorReporter reporter;
-
+ private final ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ skylarkProviderRegistry;
+
private ActionOwner actionOwner;
/* lazily computed cache for Make variables, computed from the above. See get... method */
@@ -178,6 +181,7 @@ public final class RuleContext extends TargetContext
this.features = getEnabledFeatures();
this.ruleClassNameForLogging = ruleClassNameForLogging;
this.aspectAttributes = aspectAttributes;
+ this.skylarkProviderRegistry = builder.skylarkProviderRegistry;
this.hostConfiguration = builder.hostConfiguration;
reporter = builder.reporter;
}
@@ -269,6 +273,15 @@ public final class RuleContext extends TargetContext
}
/**
+ * Returns a map that indicates which providers should be exported to skylark under the key
+ * (map key). These provider types will also be exportable by skylark rules under (map key).
+ */
+ public ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ getSkylarkProviderRegistry() {
+ return skylarkProviderRegistry;
+ }
+
+ /**
* Returns whether this instance is known to have errors at this point during analysis. Do not
* call this method after the initializationHook has returned.
*/
@@ -1307,6 +1320,7 @@ public final class RuleContext extends TargetContext
private Set<ConfigMatchingProvider> configConditions;
private NestedSet<PackageSpecification> visibility;
private ImmutableMap<String, Attribute> aspectAttributes;
+ private ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> skylarkProviderRegistry;
Builder(
AnalysisEnvironment env,
@@ -1393,6 +1407,16 @@ public final class RuleContext extends TargetContext
return this;
}
+ /**
+ * Sets a map that indicates which providers should be exported to skylark under the key
+ * (map key). These provider types will also be exportable by skylark rules under (map key).
+ */
+ Builder setSkylarkProvidersRegistry(
+ ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> skylarkProviderRegistry) {
+ this.skylarkProviderRegistry = skylarkProviderRegistry;
+ return this;
+ }
+
private boolean validateFilesetEntry(FilesetEntry filesetEntry, ConfiguredTarget src) {
if (src.getProvider(FilesetProvider.class) != null) {
return true;
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 674a88107e..f2f909a4a0 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
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.bazel.rules;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
@@ -23,6 +24,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigRuleClasses;
@@ -129,6 +131,7 @@ import com.google.devtools.build.lib.rules.objc.ObjcFrameworkRule;
import com.google.devtools.build.lib.rules.objc.ObjcImportRule;
import com.google.devtools.build.lib.rules.objc.ObjcLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule;
+import com.google.devtools.build.lib.rules.objc.ObjcProvider;
import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses;
import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule;
import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule;
@@ -241,10 +244,19 @@ public class BazelRuleClassProvider {
/**
* Java objects accessible from Skylark rule implementations using this module.
*/
- public static final ImmutableMap<String, Object> skylarkBuiltinJavaObects =
+ public static final ImmutableMap<String, Object> SKYLARK_BUILT_IN_JAVA_OBJECTS =
ImmutableMap.of(
"android_common", new AndroidSkylarkCommon(),
"apple_common", new AppleSkylarkCommon());
+ /**
+ * Native provider types registered for use in skylark. If these provider types are exported
+ * by native rules, they will be made accessible to dependent skylark rules. They also can
+ * be exported by skylark rules under the name (map key).
+ */
+ private static final ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ SKYLARK_PROVIDERS_TO_REGISTER =
+ ImmutableBiMap.<String, Class<? extends TransitiveInfoProvider>>of(
+ ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, ObjcProvider.class);
public static void setup(ConfiguredRuleClassProvider.Builder builder) {
builder
@@ -256,7 +268,8 @@ public class BazelRuleClassProvider {
.setRunfilesPrefix("__main__")
.setToolsRepository(TOOLS_REPOSITORY)
.setPrerequisiteValidator(new BazelPrerequisiteValidator())
- .setSkylarkAccessibleTopLevels(skylarkBuiltinJavaObects);
+ .setSkylarkAccessibleTopLevels(SKYLARK_BUILT_IN_JAVA_OBJECTS)
+ .setSkylarkProviderRegistry(SKYLARK_PROVIDERS_TO_REGISTER);
builder.addBuildOptions(BUILD_OPTIONS);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
index 263fc49468..0cc409fd74 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleConfiguredTargetBuilder.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.RunfilesSupport;
import com.google.devtools.build.lib.analysis.SkylarkProviderValidationUtil;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.events.Location;
@@ -60,9 +61,14 @@ import java.util.Map;
public final class SkylarkRuleConfiguredTargetBuilder {
/**
- * Create a Rule Configured Target from the ruleContext and the ruleImplementation.
+ * Create a Rule Configured Target from the ruleContext and the ruleImplementation. The
+ * registeredProviderTypes map indicates which keys in structs returned by skylark rules
+ * should be interpreted as native TransitiveInfoProvider instances of type (map value).
*/
- public static ConfiguredTarget buildRule(RuleContext ruleContext, BaseFunction ruleImplementation)
+ public static ConfiguredTarget buildRule(
+ RuleContext ruleContext,
+ BaseFunction ruleImplementation,
+ Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
throws InterruptedException {
String expectFailure = ruleContext.attributes().get("expect_failure", Type.STRING);
try (Mutability mutability = Mutability.create("configured target")) {
@@ -90,7 +96,8 @@ public final class SkylarkRuleConfiguredTargetBuilder {
ruleContext.ruleError("Expected failure not found: " + expectFailure);
return null;
}
- ConfiguredTarget configuredTarget = createTarget(ruleContext, target);
+ ConfiguredTarget configuredTarget =
+ createTarget(ruleContext, target, registeredProviderTypes);
SkylarkProviderValidationUtil.checkOrphanArtifacts(ruleContext);
return configuredTarget;
} catch (EvalException e) {
@@ -131,7 +138,10 @@ public final class SkylarkRuleConfiguredTargetBuilder {
// TODO(bazel-team): this whole defaulting - overriding executable, runfiles and files_to_build
// is getting out of hand. Clean this whole mess up.
- private static ConfiguredTarget createTarget(RuleContext ruleContext, Object target)
+ private static ConfiguredTarget createTarget(
+ RuleContext ruleContext,
+ Object target,
+ Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
throws EvalException {
Artifact executable = getExecutable(ruleContext, target);
RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
@@ -142,7 +152,7 @@ public final class SkylarkRuleConfiguredTargetBuilder {
filesToBuild.add(executable);
}
builder.setFilesToBuild(filesToBuild.build());
- return addStructFields(ruleContext, builder, target, executable);
+ return addStructFields(ruleContext, builder, target, executable, registeredProviderTypes);
}
private static Artifact getExecutable(RuleContext ruleContext, Object target)
@@ -206,8 +216,12 @@ public final class SkylarkRuleConfiguredTargetBuilder {
}
}
- private static ConfiguredTarget addStructFields(RuleContext ruleContext,
- RuleConfiguredTargetBuilder builder, Object target, Artifact executable)
+ private static ConfiguredTarget addStructFields(
+ RuleContext ruleContext,
+ RuleConfiguredTargetBuilder builder,
+ Object target,
+ Artifact executable,
+ Map<String, Class<? extends TransitiveInfoProvider>> registeredProviderTypes)
throws EvalException {
Location loc = null;
Runfiles statelessRunfiles = null;
@@ -268,6 +282,10 @@ public final class SkylarkRuleConfiguredTargetBuilder {
InstrumentedFilesCollector.NO_METADATA_COLLECTOR,
Collections.<Artifact>emptySet());
builder.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider);
+ } else if (registeredProviderTypes.containsKey(key)) {
+ Class<? extends TransitiveInfoProvider> providerType = registeredProviderTypes.get(key);
+ TransitiveInfoProvider provider = cast(key, struct, providerType, loc);
+ builder.addProvider(providerType, provider);
} else if (!key.equals("executable")) {
// We handled executable already.
builder.addSkylarkTransitiveInfo(key, struct.getValue(key), loc);
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 f77e8ba1b7..a8d9931cd6 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
@@ -14,9 +14,18 @@
package com.google.devtools.build.lib.rules.objc;
+import com.google.common.annotations.VisibleForTesting;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
+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;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature.Param;
+import com.google.devtools.build.lib.syntax.BuiltinFunction;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
+import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
+
+import java.util.Map.Entry;
/**
* A class that exposes apple rule implementation internals to skylark.
@@ -26,6 +35,25 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
doc = "Functions for skylark to access internals of the apple rule implementations."
)
public class AppleSkylarkCommon {
+
+ @VisibleForTesting
+ public static final String BAD_KEY_ERROR = "Argument %s not a recognized key or 'providers'.";
+
+ @VisibleForTesting
+ public static final String BAD_SET_TYPE_ERROR =
+ "Value for key %s must be a set of %s, instead found set of %s.";
+
+ @VisibleForTesting
+ public static final String BAD_PROVIDERS_ITER_ERROR =
+ "Value for argument 'providers' must be a list of ObjcProvider instances, instead found %s.";
+
+ @VisibleForTesting
+ public static final String BAD_PROVIDERS_ELEM_ERROR =
+ "Value for argument 'providers' must be a list of ObjcProvider instances, instead found "
+ + "iterable with %s.";
+
+ @VisibleForTesting
+ public static final String NOT_SET_ERROR = "Value for key %s must be a set, instead found %s.";
@SkylarkCallable(
name = "apple_toolchain",
@@ -34,14 +62,46 @@ public class AppleSkylarkCommon {
public AppleToolchain getAppleToolchain() {
return new AppleToolchain();
}
-
- @SkylarkCallable(
- name = "keys",
- doc = "Retrieves ObjcProvider keys",
- structField = true
+
+ @SkylarkSignature(
+ name = "new_objc_provider",
+ objectType = AppleSkylarkCommon.class,
+ returnType = ObjcProvider.class,
+ doc = "Creates a new ObjcProvider instance.",
+ mandatoryPositionals = {
+ @Param(name = "self", type = AppleSkylarkCommon.class, doc = "The apple_common instance.")
+ },
+ extraKeywords = {
+ @Param(
+ name = "kwargs",
+ type = SkylarkDict.class,
+ defaultValue = "{}",
+ doc = "Dictionary of arguments"
+ )
+ }
)
- public SkylarkKeyStore getKeys() {
- return new SkylarkKeyStore();
- }
+ public static final BuiltinFunction NEW_OBJC_PROVIDER =
+ new BuiltinFunction("new_objc_provider") {
+ @SuppressWarnings("unused")
+ // This method is registered statically for skylark, and never called directly.
+ public ObjcProvider invoke(AppleSkylarkCommon self, SkylarkDict<String, Object> kwargs) {
+ ObjcProvider.Builder resultBuilder = new ObjcProvider.Builder();
+ for (Entry<String, Object> entry : kwargs.entrySet()) {
+ Key<?> key = ObjcProvider.getSkylarkKeyForString(entry.getKey());
+ if (key != null) {
+ resultBuilder.addElementsFromSkylark(key, entry.getValue());
+ } else if (entry.getKey().equals("providers")) {
+ resultBuilder.addProvidersFromSkylark(entry.getValue());
+ } else {
+ throw new IllegalArgumentException(String.format(BAD_KEY_ERROR, entry.getKey()));
+ }
+ }
+ return resultBuilder.build();
+ }
+ };
+
+ static {
+ SkylarkSignatureProcessor.configureSkylarkFunctions(AppleSkylarkCommon.class);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index 442a847494..d06a374f07 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -27,7 +27,6 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RunfilesSupport;
-import com.google.devtools.build.lib.analysis.SkylarkProviders;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
@@ -38,7 +37,6 @@ import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
-import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
/**
* Implementation for rules that link binaries.
@@ -173,10 +171,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
.addProvider(ObjcProvider.class, objcProvider)
.addProvider(
InstrumentedFilesProvider.class,
- compilationSupport.getInstrumentedFilesProvider(common))
- .addSkylarkTransitiveInfo(
- ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME,
- common.getObjcProvider().toSkylarkProvider());
+ compilationSupport.getInstrumentedFilesProvider(common));
if (xcTestAppProvider.isPresent()) {
// TODO(bazel-team): Stop exporting an XcTestAppProvider once objc_binary no longer creates an
// application bundle.
@@ -222,8 +217,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
.setHasModuleMap()
.setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary());
- builder.addDepObjcProviders(createSkylarkObjcProviders(ruleContext));
-
if (ObjcRuleClasses.objcConfiguration(ruleContext).generateDebugSymbols()
|| ObjcRuleClasses.objcConfiguration(ruleContext).generateDsym()) {
builder.addDebugArtifacts(DsymOutputType.APP);
@@ -237,25 +230,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
}
/**
- * Constructs an ObjcProvider instance for each skylark objc provider in this target's
- * dependencies.
- */
- private Iterable<ObjcProvider> createSkylarkObjcProviders(RuleContext ruleContext) {
- ImmutableList.Builder<ObjcProvider> skylarkProviderListBuilder = ImmutableList.builder();
- for (SkylarkProviders skylarkProviders :
- ruleContext.getPrerequisites("deps", Mode.TARGET, SkylarkProviders.class)) {
- Object objcSkylarkProvider =
- skylarkProviders.getValue(ObjcProvider.OBJC_SKYLARK_PROVIDER_TO_EXPORT_NAME);
- if (objcSkylarkProvider != null) {
- ObjcProvider objcProviderFromSkylark =
- ObjcProvider.fromSkylarkProvider((SkylarkClassObject) objcSkylarkProvider);
- skylarkProviderListBuilder.add(objcProviderFromSkylark);
- }
- }
- return skylarkProviderListBuilder.build();
- }
-
- /**
* Performs additional configuration of the target. The default implementation does nothing, but
* subclasses may override it to add logic.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index c2dce23cbb..fd37871cc8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -82,8 +82,6 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
.addProvider(ObjcProvider.class, objcProvider)
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
- .addSkylarkTransitiveInfo(
- ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, objcProvider.toSkylarkProvider())
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 991a6d83be..aad16f1e1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -143,8 +143,6 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.addProvider(
CcLinkParamsProvider.class,
new CcLinkParamsProvider(new ObjcLibraryCcLinkParamsStore(common)))
- .addSkylarkTransitiveInfo(
- ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, common.getObjcProvider().toSkylarkProvider())
.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
index e46d8204ec..c7b115f79a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
@@ -64,8 +64,6 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory {
return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
.addProvider(ObjcProvider.class, common.getObjcProvider())
- .addSkylarkTransitiveInfo(
- ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, common.getObjcProvider().toSkylarkProvider())
.build();
}
}
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 91f5c1fca2..92ddc73b3f 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,10 +28,10 @@ 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.syntax.SkylarkType;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.TargetControl;
@@ -44,29 +44,19 @@ import java.util.Map;
* deps that are needed for building Objective-C rules.
*/
@Immutable
-public final class ObjcProvider implements TransitiveInfoProvider {
+@SkylarkModule(name = "ObjcProvider", doc = "A provider for compilation and linking of objc.")
+public final class ObjcProvider extends SkylarkClassObject implements TransitiveInfoProvider {
/**
- * The name skylark dependents can use to access a Skylark provider containing information
- * from a target's ObjcProvider.
+ * The skylark struct key name for a rule implementation to use when exporting an ObjcProvider.
*/
public static final String OBJC_SKYLARK_PROVIDER_NAME = "objc";
/**
- * The name skylark dependents can use to export a native objc provider to depending native
- * rules.
- *
- * <p>This constant must be different from OBJC_SKYLARK_PROVIDER_NAME to prevent skylark rules
- * from automatically exporting the ObjcProvider provided to them by dependents. This can
- * lead to duplicate symbol linker errors.
- */
- public static final String OBJC_SKYLARK_PROVIDER_TO_EXPORT_NAME = "objc_export";
-
- /**
* 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.")
+ @Immutable
public static class Key<E> {
private final Order order;
private final String skylarkKeyName;
@@ -81,7 +71,6 @@ 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;
}
@@ -95,6 +84,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
}
public static final Key<Artifact> LIBRARY = new Key<>(LINK_ORDER, "library", Artifact.class);
+
public static final Key<Artifact> IMPORTED_LIBRARY =
new Key<>(LINK_ORDER, "imported_library", Artifact.class);
@@ -339,6 +329,51 @@ public final class ObjcProvider implements TransitiveInfoProvider {
// Items which should not be propagated to dependents.
private final ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems;
+ /**
+ * 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<Key<?>> KEYS_FOR_SKYLARK =
+ ImmutableList.<Key<?>>of(
+ LIBRARY,
+ IMPORTED_LIBRARY,
+ LINKED_BINARY,
+ FORCE_LOAD_LIBRARY,
+ HEADER,
+ SOURCE,
+ DEFINE,
+ ASSET_CATALOG,
+ 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);
+
+ /**
+ * Returns the skylark key for the given string, or null if no such key exists or is available
+ * to Skylark.
+ */
+ static Key<?> getSkylarkKeyForString(String keyName) {
+ Key<?> result = null;
+ for (Key<?> candidateKey : KEYS_FOR_SKYLARK) {
+ if (candidateKey.getSkylarkKeyName().equals(keyName)) {
+ return candidateKey;
+ }
+ }
+ return null;
+ }
// Items which should be passed to strictly direct dependers, but not transitive dependers.
private final ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems;
@@ -346,7 +381,9 @@ public final class ObjcProvider implements TransitiveInfoProvider {
private ObjcProvider(
ImmutableMap<Key<?>, NestedSet<?>> items,
ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems,
- ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems) {
+ ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems,
+ ImmutableMap<String, Object> skylarkFields) {
+ super(skylarkFields, "ObjcProvider field %s could not be instantiated");
this.items = Preconditions.checkNotNull(items);
this.nonPropagatedItems = Preconditions.checkNotNull(nonPropagatedItems);
this.strictDependencyItems = Preconditions.checkNotNull(strictDependencyItems);
@@ -387,35 +424,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
}
/**
- * Returns a {@code SkylarkClassObject} containing values from this provider that is suitable
- * for a skylark provider.
- */
- public SkylarkClassObject toSkylarkProvider() {
- ImmutableMap.Builder<String, Object> providerBuilder = ImmutableMap.<String, Object>builder();
- 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'");
- }
-
- /**
- * Returns an {@code ObjcProvider} from a given skylark provider. For each candidate key
- * in the ObjcProvider, will check the given skylark provider to see if that key is represented
- * in the returned struct.
- */
- public static ObjcProvider fromSkylarkProvider(SkylarkClassObject skylarkProvider) {
- Builder builder = new Builder();
- for (Key<?> key : SkylarkKeyStore.KEYS_FOR_SKYLARK) {
- SkylarkNestedSet skylarkSet =
- (SkylarkNestedSet) skylarkProvider.getValue(key.getSkylarkKeyName());
- if (skylarkSet != null) {
- builder.uncheckedAddAll(key, skylarkSet.getSet(key.getType()), builder.items);
- }
- }
- return builder.build();
- }
-
- /**
* A builder for this context with an API that is optimized for collecting information from
* several transitive dependencies.
*/
@@ -576,20 +584,83 @@ public final class ObjcProvider implements TransitiveInfoProvider {
return this;
}
+ /**
+ * Add elements in toAdd with the given key from skylark. An error is thrown if toAdd is not
+ * an appropriate SkylarkNestedSet.
+ */
+ void addElementsFromSkylark(Key<?> key, Object toAdd) {
+ if (!(toAdd instanceof SkylarkNestedSet)) {
+ throw new IllegalArgumentException(
+ String.format(
+ AppleSkylarkCommon.NOT_SET_ERROR, key.getSkylarkKeyName(), toAdd.getClass()));
+ } else if (!((SkylarkNestedSet) toAdd).getContentType().canBeCastTo(key.getType())) {
+ throw new IllegalArgumentException(
+ String.format(
+ AppleSkylarkCommon.BAD_SET_TYPE_ERROR,
+ key.getSkylarkKeyName(),
+ key.getType(),
+ ((SkylarkNestedSet) toAdd).getContentType().getType()));
+ } else {
+ uncheckedAddAll(key, (SkylarkNestedSet) toAdd, this.items);
+ }
+ }
+
+ /**
+ * Adds the given providers from skylark. An error is thrown if toAdd is not an iterable of
+ * ObjcProvider instances.
+ */
+ @SuppressWarnings("unchecked")
+ void addProvidersFromSkylark(Object toAdd) {
+ if (!(toAdd instanceof Iterable)) {
+ throw new IllegalArgumentException(
+ String.format(AppleSkylarkCommon.BAD_PROVIDERS_ITER_ERROR, toAdd.getClass()));
+ } else {
+ Iterable<Object> toAddIterable = (Iterable<Object>) toAdd;
+ for (Object toAddObject : toAddIterable) {
+ if (!(toAddObject instanceof ObjcProvider)) {
+ throw new IllegalArgumentException(
+ String.format(AppleSkylarkCommon.BAD_PROVIDERS_ELEM_ERROR, toAddObject.getClass()));
+ } else {
+ this.addTransitiveAndPropagate((ObjcProvider) toAddObject);
+ }
+ }
+ }
+ }
+
public ObjcProvider build() {
- ImmutableMap.Builder<Key<?>, NestedSet<?>> propagated = new ImmutableMap.Builder<>();
+ ImmutableMap.Builder<Key<?>, NestedSet<?>> propagatedBuilder = new ImmutableMap.Builder<>();
for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : items.entrySet()) {
- propagated.put(typeEntry.getKey(), typeEntry.getValue().build());
+ propagatedBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
}
- ImmutableMap.Builder<Key<?>, NestedSet<?>> nonPropagated = new ImmutableMap.Builder<>();
+ ImmutableMap.Builder<Key<?>, NestedSet<?>> nonPropagatedBuilder =
+ new ImmutableMap.Builder<>();
for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : nonPropagatedItems.entrySet()) {
- nonPropagated.put(typeEntry.getKey(), typeEntry.getValue().build());
+ nonPropagatedBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
}
- ImmutableMap.Builder<Key<?>, NestedSet<?>> strictDependency = new ImmutableMap.Builder<>();
+ ImmutableMap.Builder<Key<?>, NestedSet<?>> strictDependencyBuilder =
+ new ImmutableMap.Builder<>();
for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : strictDependencyItems.entrySet()) {
- strictDependency.put(typeEntry.getKey(), typeEntry.getValue().build());
+ strictDependencyBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
+ }
+
+ ImmutableMap<Key<?>, NestedSet<?>> propagated = propagatedBuilder.build();
+ ImmutableMap<Key<?>, NestedSet<?>> nonPropagated = nonPropagatedBuilder.build();
+ ImmutableMap<Key<?>, NestedSet<?>> strictDependency = strictDependencyBuilder.build();
+
+ ImmutableMap.Builder<String, Object> skylarkFields = new ImmutableMap.Builder<>();
+ for (Key<?> key : KEYS_FOR_SKYLARK) {
+ SkylarkType type = SkylarkType.of(key.getType());
+ if (items.containsKey(key)) {
+ skylarkFields.put(
+ key.getSkylarkKeyName(), SkylarkNestedSet.of(type, propagated.get(key)));
+ }
+ if (strictDependency.containsKey(key)) {
+ skylarkFields.put(
+ key.getSkylarkKeyName(), SkylarkNestedSet.of(type, strictDependency.get(key)));
+ }
}
- return new ObjcProvider(propagated.build(), nonPropagated.build(), strictDependency.build());
+
+ return new ObjcProvider(propagated, nonPropagated, strictDependency, skylarkFields.build());
}
}
}
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
deleted file mode 100644
index 0b99bdcdc1..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/SkylarkKeyStore.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// 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);
-}