diff options
author | Florian Weikert <fwe@google.com> | 2015-09-07 12:06:02 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-09-08 09:04:15 +0000 |
commit | 3f8aac93ff0b2f06bc01b60614a265304aec177d (patch) | |
tree | a700689c1961f917d0d35cf5aca7c7a9e962d32f /src/main/java/com/google/devtools/build/lib/packages/RuleClass.java | |
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/packages/RuleClass.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/RuleClass.java | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 59fcbb595b..1202f0465c 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -31,6 +31,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Ordering; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.Location; +import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; import com.google.devtools.build.lib.syntax.Argument; import com.google.devtools.build.lib.syntax.BaseFunction; @@ -501,7 +502,8 @@ public final class RuleClass { private SkylarkEnvironment ruleDefinitionEnvironment = null; private Set<Class<?>> configurationFragments = new LinkedHashSet<>(); private MissingFragmentPolicy missingFragmentPolicy = MissingFragmentPolicy.FAIL_ANALYSIS; - private Set<String> requiredFragmentNames = new LinkedHashSet<>(); + private Map<ConfigurationTransition, ImmutableSet<String>> requiredFragmentNames = + new LinkedHashMap<>(); private FragmentClassNameResolver fragmentNameResolver; private boolean supportsConstraintChecking = true; @@ -590,7 +592,7 @@ public final class RuleClass { configuredTargetFactory, validityPredicate, preferredDependencyPredicate, ImmutableSet.copyOf(advertisedProviders), configuredTargetFunction, externalBindingsFunction, ruleDefinitionEnvironment, configurationFragments, - requiredFragmentNames, fragmentNameResolver, missingFragmentPolicy, + ImmutableMap.copyOf(requiredFragmentNames), fragmentNameResolver, missingFragmentPolicy, supportsConstraintChecking, attributes.values().toArray(new Attribute[0])); } @@ -615,14 +617,18 @@ public final class RuleClass { this.missingFragmentPolicy = missingFragmentPolicy; return this; } - + /** - * Does the same as {@link #requiresConfigurationFragments(Class...)}, except for taking names - * of fragments instead of classes. + * Declares the configuration fragments that are required by this rule. + * + * <p>In contrast to {@link #requiresConfigurationFragments(Class...)}, this method a) takes the + * names of fragments instead of their classes and b) distinguishes whether the fragments can be + * accessed in host (HOST) or target (NONE) configuration. */ public Builder requiresConfigurationFragments( - FragmentClassNameResolver fragmentNameResolver, String... configurationFragmentNames) { - Collections.addAll(requiredFragmentNames, configurationFragmentNames); + FragmentClassNameResolver fragmentNameResolver, + Map<ConfigurationTransition, ImmutableSet<String>> configurationFragmentNames) { + requiredFragmentNames.putAll(configurationFragmentNames); this.fragmentNameResolver = fragmentNameResolver; return this; } @@ -974,10 +980,12 @@ public final class RuleClass { private final ImmutableSet<Class<?>> requiredConfigurationFragments; /** - * Same idea as requiredConfigurationFragments, but stores fragments by name instead of by class + * A dictionary that maps configurations (NONE for target configuration, HOST for host + * configuration) to lists of names of required configuration fragments. */ - private final ImmutableSet<String> requiredConfigurationFragmentNames; - + private final ImmutableMap<ConfigurationTransition, ImmutableSet<String>> + requiredConfigurationFragmentNames; + /** * Used to resolve the names of fragments in order to compare them to values in {@link * #requiredConfigurationFragmentNames} @@ -1037,7 +1045,8 @@ public final class RuleClass { externalBindingsFunction, ruleDefinitionEnvironment, allowedConfigurationFragments, - ImmutableSet.<String>of(), null, + ImmutableMap.<ConfigurationTransition, ImmutableSet<String>>of(), + null, // FragmentClassNameResolver missingFragmentPolicy, supportsConstraintChecking, attributes); @@ -1078,7 +1087,7 @@ public final class RuleClass { Function<? super Rule, Map<String, Label>> externalBindingsFunction, @Nullable SkylarkEnvironment ruleDefinitionEnvironment, Set<Class<?>> allowedConfigurationFragments, - Set<String> allowedConfigurationFragmentNames, + ImmutableMap<ConfigurationTransition, ImmutableSet<String>> allowedConfigurationFragmentNames, @Nullable FragmentClassNameResolver fragmentNameResolver, MissingFragmentPolicy missingFragmentPolicy, boolean supportsConstraintChecking, @@ -1102,8 +1111,7 @@ public final class RuleClass { this.workspaceOnly = workspaceOnly; this.outputsDefaultExecutable = outputsDefaultExecutable; this.requiredConfigurationFragments = ImmutableSet.copyOf(allowedConfigurationFragments); - this.requiredConfigurationFragmentNames = - ImmutableSet.copyOf(allowedConfigurationFragmentNames); + this.requiredConfigurationFragmentNames = allowedConfigurationFragmentNames; this.fragmentNameResolver = fragmentNameResolver; this.missingFragmentPolicy = missingFragmentPolicy; this.supportsConstraintChecking = supportsConstraintChecking; @@ -1260,24 +1268,32 @@ public final class RuleClass { } /** - * Checks if the configuration fragment may be accessed (i.e., if it's declared). If no fragments - * are declared, this allows access to all fragments for backwards compatibility. + * Checks if the configuration fragment may be accessed (i.e., if it's declared) in the specified + * configuration (target or host). */ - public boolean isLegalConfigurationFragment(Class<?> configurationFragment) { + public boolean isLegalConfigurationFragment( + Class<?> configurationFragment, ConfigurationTransition config) { return requiredConfigurationFragments.contains(configurationFragment) - || hasLegalFragmentName(configurationFragment); + || hasLegalFragmentName(configurationFragment, config); + } + + public boolean isLegalConfigurationFragment(Class<?> configurationFragment) { + // NONE means target configuration. + return isLegalConfigurationFragment(configurationFragment, ConfigurationTransition.NONE); } /** - * Checks whether the name of the given fragment class was declared as required fragment + * Checks whether the name of the given fragment class was declared as required fragment in the + * specified configuration (target or host). */ - private boolean hasLegalFragmentName(Class<?> configurationFragment) { + private boolean hasLegalFragmentName( + Class<?> configurationFragment, ConfigurationTransition config) { if (fragmentNameResolver == null) { return false; } String name = fragmentNameResolver.resolveName(configurationFragment); - return (name != null && requiredConfigurationFragmentNames.contains(name)); + return (name != null && requiredConfigurationFragmentNames.get(config).contains(name)); } /** |