aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-15 10:50:12 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-15 13:43:41 +0000
commitf81c675928c6beeaae5f66480dc7dbef47f75fb8 (patch)
treeb3320bc3e8a3d2aff2741e8361ce6cdf56db8b65 /src/main/java/com
parent7ebfedbc908adf0f2bae8e30e66abc54cb9c3336 (diff)
Enable injection of Skylark modules through the RuleClassProvider
This enable BlazeModule to specify extraneous Skylark modules. This will be used by Skylark remote repositories to add them from the BazelRepositoryModule. Issue #893, step 2 of the roadmap of http://goo.gl/OZV3o0 -- MOS_MIGRATED_REVID=114677157
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkModules.java18
2 files changed, 28 insertions, 6 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 62ab8a61c5..798b14db53 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
@@ -104,6 +104,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
private Class<? extends BuildConfiguration.Fragment> universalFragment;
private PrerequisiteValidator prerequisiteValidator;
private ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses = ImmutableMap.of();
+ private ImmutableList.Builder<Class<?>> skylarkModules =
+ ImmutableList.<Class<?>>builder().addAll(SkylarkModules.MODULES);
private final List<Class<? extends FragmentOptions>> buildOptions = Lists.newArrayList();
public void addWorkspaceFile(String contents) {
@@ -190,6 +192,11 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
return this;
}
+ public Builder addSkylarkModule(Class<?>... modules) {
+ this.skylarkModules.add(modules);
+ return this;
+ }
+
private RuleConfiguredTargetFactory createFactory(
Class<? extends RuleConfiguredTargetFactory> factoryClass) {
try {
@@ -264,6 +271,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
universalFragment,
prerequisiteValidator,
skylarkAccessibleJavaClasses,
+ skylarkModules.build(),
buildOptions);
}
@@ -374,6 +382,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
Class<? extends BuildConfiguration.Fragment> universalFragment,
PrerequisiteValidator prerequisiteValidator,
ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses,
+ ImmutableList<Class<?>> skylarkModules,
List<Class<? extends FragmentOptions>> buildOptions) {
this.preludeLabel = preludeLabel;
this.runfilesPrefix = runfilesPrefix;
@@ -388,7 +397,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
this.configurationCollectionFactory = configurationCollectionFactory;
this.universalFragment = universalFragment;
this.prerequisiteValidator = prerequisiteValidator;
- this.globals = createGlobals(skylarkAccessibleJavaClasses);
+ this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules);
this.buildOptions = buildOptions;
}
@@ -491,10 +500,11 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider {
}
private Environment.Frame createGlobals(
- ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses) {
+ ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses,
+ ImmutableList<Class<?>> modules) {
try (Mutability mutability = Mutability.create("ConfiguredRuleClassProvider globals")) {
Environment env = createSkylarkRuleClassEnvironment(
- mutability, SkylarkModules.GLOBALS, null, null, null);
+ mutability, SkylarkModules.getGlobals(modules), null, null, null);
for (Map.Entry<String, SkylarkType> entry : skylarkAccessibleJavaClasses.entrySet()) {
env.setup(entry.getKey(), entry.getValue().getType());
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkModules.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkModules.java
index 08487f8d29..ef2767be9a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkModules.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkModules.java
@@ -17,9 +17,14 @@ package com.google.devtools.build.lib.rules;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.packages.SkylarkNativeModule;
import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.Environment.Frame;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.Runtime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* The basis for a Skylark Environment with all build-related modules registered.
*/
@@ -40,15 +45,22 @@ public final class SkylarkModules {
SkylarkRuleImplementationFunctions.class);
/** Global bindings for all Skylark modules */
- public static final Environment.Frame GLOBALS = createGlobals();
+ private static final Map<List<Class<?>>, Frame> cache = new HashMap<>();
+
+ public static Environment.Frame getGlobals(List<Class<?>> modules) {
+ if (!cache.containsKey(modules)) {
+ cache.put(modules, createGlobals(modules));
+ }
+ return cache.get(modules);
+ }
- private static Environment.Frame createGlobals() {
+ private static Environment.Frame createGlobals(List<Class<?>> modules) {
try (Mutability mutability = Mutability.create("SkylarkModules")) {
Environment env = Environment.builder(mutability)
.setSkylark()
.setGlobals(Environment.SKYLARK)
.build();
- for (Class<?> moduleClass : MODULES) {
+ for (Class<?> moduleClass : modules) {
Runtime.registerModuleGlobals(env, moduleClass);
}
return env.getGlobals();