diff options
author | 2015-09-07 12:06:02 +0000 | |
---|---|---|
committer | 2015-09-08 09:04:15 +0000 | |
commit | 3f8aac93ff0b2f06bc01b60614a265304aec177d (patch) | |
tree | a700689c1961f917d0d35cf5aca7c7a9e962d32f /src/main/java/com/google/devtools/build/lib/analysis | |
parent | 7a046e16d135821d224382352c7098e0c004a779 (diff) |
Skylark: configuration fragments for host configuration can now be accessed via ctx.host_fragments.
--
MOS_MIGRATED_REVID=102490502
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | 39 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java | 19 |
2 files changed, 43 insertions, 15 deletions
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 af05afd28d..b6affcacf9 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 @@ -39,6 +39,7 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildIn import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; +import com.google.devtools.build.lib.analysis.config.FragmentCollection; import com.google.devtools.build.lib.collect.ImmutableSortedKeyListMultimap; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -257,26 +258,44 @@ public final class RuleContext extends TargetContext * Returns a configuration fragment for this this target. */ @Nullable - public <T extends Fragment> T getFragment(Class<T> fragment) { + public <T extends Fragment> T getFragment(Class<T> fragment, ConfigurationTransition config) { // TODO(bazel-team): The fragments can also be accessed directly through BuildConfiguration. // Can we lock that down somehow? - Preconditions.checkArgument(isLegalFragment(fragment), - "%s does not have access to %s", rule.getRuleClass(), fragment); - return getConfiguration().getFragment(fragment); + Preconditions.checkArgument(isLegalFragment(fragment, config), + "%s does not have access to '%s' in %s configuration", rule.getRuleClass(), + fragment.getSimpleName(), FragmentCollection.getConfigurationName(config)); + return getConfiguration(config).getFragment(fragment); + } + + @Nullable + public <T extends Fragment> T getFragment(Class<T> fragment) { + // NONE means target configuration. + return getFragment(fragment, ConfigurationTransition.NONE); } @Nullable - public Fragment getSkylarkFragment(String name) { - Class<? extends Fragment> fragmentClass = getConfiguration().getSkylarkFragmentByName(name); - return (fragmentClass == null) ? null : getFragment(fragmentClass); + public Fragment getSkylarkFragment(String name, ConfigurationTransition config) { + Class<? extends Fragment> fragmentClass = + getConfiguration(config).getSkylarkFragmentByName(name); + return (fragmentClass == null) ? null : getFragment(fragmentClass, config); + } + + public ImmutableCollection<String> getSkylarkFragmentNames(ConfigurationTransition config) { + return getConfiguration(config).getSkylarkFragmentNames(); } - public ImmutableCollection<String> getSkylarkFragmentNames() { - return getConfiguration().getSkylarkFragmentNames(); + public <T extends Fragment> boolean isLegalFragment( + Class<T> fragment, ConfigurationTransition config) { + return rule.getRuleClassObject().isLegalConfigurationFragment(fragment, config); } public <T extends Fragment> boolean isLegalFragment(Class<T> fragment) { - return rule.getRuleClassObject().isLegalConfigurationFragment(fragment); + // NONE means target configuration. + return isLegalFragment(fragment, ConfigurationTransition.NONE); + } + + protected BuildConfiguration getConfiguration(ConfigurationTransition config) { + return config.equals(ConfigurationTransition.HOST) ? hostConfiguration : getConfiguration(); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java index d649f47b51..a7d935a23c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentCollection.java @@ -17,6 +17,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableCollection; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition; import com.google.devtools.build.lib.syntax.ClassObject; import com.google.devtools.build.lib.syntax.SkylarkModule; @@ -30,30 +31,38 @@ import javax.annotation.Nullable; @SkylarkModule(name = "fragments", documented = false, doc = "") public class FragmentCollection implements ClassObject { private final RuleContext ruleContext; + private final ConfigurationTransition config; - public FragmentCollection(RuleContext ruleContext) { + public FragmentCollection(RuleContext ruleContext, ConfigurationTransition config) { this.ruleContext = ruleContext; + this.config = config; } @Override @Nullable public Object getValue(String name) { - return ruleContext.getSkylarkFragment(name); + return ruleContext.getSkylarkFragment(name, config); } @Override public ImmutableCollection<String> getKeys() { - return ruleContext.getSkylarkFragmentNames(); + return ruleContext.getSkylarkFragmentNames(config); } @Override @Nullable public String errorMessage(String name) { - return String.format("There is no configuration fragment named '%s'. Available fragments: %s", - name, printKeys()); + return String.format( + "There is no configuration fragment named '%s' in %s configuration. " + + "Available fragments: %s", + name, getConfigurationName(config), printKeys()); } private String printKeys() { return String.format("'%s'", Joiner.on("', '").join(getKeys())); } + + public static String getConfigurationName(ConfigurationTransition config) { + return (config == ConfigurationTransition.HOST) ? "host" : "target"; + } }
\ No newline at end of file |