diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config')
3 files changed, 184 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareAspectBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareAspectBuilder.java new file mode 100644 index 0000000000..0b6bb2a5a4 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareAspectBuilder.java @@ -0,0 +1,89 @@ +// Copyright 2017 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.analysis.config; + +import com.google.devtools.build.lib.packages.AspectDefinition; +import java.util.Collection; + +/** + * A wrapper for {@link AspectDefinition.Builder} that supports access to {@link + * com.google.devtools.build.lib.analysis} classes. + * + * <p>{@link AspectDefinition.Builder} is in {@link com.google.devtools.build.lib.packages}, so it + * can't reference analysis-time objects. + */ +public class ConfigAwareAspectBuilder { + private final AspectDefinition.Builder aspectBuilder; + + /** + * Instantiates a builder wrapped around the given {@link AspectDefinition.Builder}. + */ + private ConfigAwareAspectBuilder(AspectDefinition.Builder aspectBuilder) { + this.aspectBuilder = aspectBuilder; + } + + /** + * Instantiates a builder wrapped around the given {@link AspectDefinition.Builder}. + */ + public static ConfigAwareAspectBuilder of(AspectDefinition.Builder aspectBuilder) { + return new ConfigAwareAspectBuilder(aspectBuilder); + } + + /** + * Returns the {@link AspectDefinition.Builder} this object wraps. + * + * <p>Call this when done with config-specific building to re-expose the builder methods in + * {@link AspectDefinition.Builder} + */ + public AspectDefinition.Builder originalBuilder() { + return aspectBuilder; + } + + /** + * Declares the fragments required by this aspect for the configuration of the host machine this + * aspect's actions execute on. + * + * <p>This is not the same as the aspect's configuration. The aspect's configuration is its + * <i>target</i> configuration, which determines the platform it builds outputs for. The actions + * created by this aspect run on a host machine, which is what the host configuration corresponds + * to. + * + * <p>The value is inherited by subclasses. + */ + public ConfigAwareAspectBuilder requiresHostConfigurationFragments( + Class<? extends BuildConfiguration.Fragment>... configurationFragments) { + aspectBuilder.requiresConfigurationFragments(HostTransition.INSTANCE, configurationFragments); + return this; + } + + /** + * Declares the fragments required by this aspect for the configuration of the host machine this + * aspect's actions execute on. + * + * <p>This is not the same as the aspect's configuration. The aspect's configuration is its + * <i>target</i> configuration, which determines the platform it builds outputs for. The actions + * created by this aspect run on a host machine, which is what the host configuration corresponds + * to. + * + * <p>In contrast to {@link #requiresHostConfigurationFragments(Class...)}, this method takes + * Skylark module names of fragments instead of their classes. + */ + public ConfigAwareAspectBuilder requiresHostConfigurationFragmentsBySkylarkModuleName( + Collection<String> configurationFragmentNames) { + aspectBuilder.requiresConfigurationFragmentsBySkylarkModuleName(HostTransition.INSTANCE, + configurationFragmentNames); + return this; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java new file mode 100644 index 0000000000..bfa54147ea --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java @@ -0,0 +1,90 @@ +// Copyright 2017 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.analysis.config; + +import com.google.devtools.build.lib.packages.RuleClass; +import java.util.Collection; + +/** + * A wrapper for {@link RuleClass.Builder} that supports access to {@link + * com.google.devtools.build.lib.analysis} classes. + * + * <p>{@link RuleClass.Builder} is in {@link com.google.devtools.build.lib.packages}, so it can't + * reference analysis-time objects. + */ +public class ConfigAwareRuleClassBuilder { + private final RuleClass.Builder ruleClassBuilder; + + /** + * Instantiates a builder wrapped around the given {@link RuleClass.Builder}. + */ + private ConfigAwareRuleClassBuilder(RuleClass.Builder ruleClassBuilder) { + this.ruleClassBuilder = ruleClassBuilder; + } + + /** + * Instantiates a builder wrapped around the given {@link RuleClass.Builder}. + */ + public static ConfigAwareRuleClassBuilder of(RuleClass.Builder ruleClassBuilder) { + return new ConfigAwareRuleClassBuilder(ruleClassBuilder); + } + + /** + * Returns the {@link RuleClass.Builder} this object wraps. + * + * <p>Call this when done with config-specific building to re-expose the builder methods in + * {@link RuleClass.Builder} + */ + public RuleClass.Builder originalBuilder() { + return ruleClassBuilder; + } + + /** + * Declares the fragments required by this rule for the configuration of the host machine this + * rule's actions execute on. + * + * <p>This is not the same as the rule's configuration. The rule's configuration is its + * <i>target</i> configuration, which determines the platform it builds outputs for. The actions + * created by this rule run on a host machine, which is what the host configuration corresponds + * to. + * + * <p>The value is inherited by subclasses. + */ + public ConfigAwareRuleClassBuilder requiresHostConfigurationFragments( + Class<? extends BuildConfiguration.Fragment>... configurationFragments) { + ruleClassBuilder.requiresConfigurationFragments(HostTransition.INSTANCE, + configurationFragments); + return this; + } + + /** + * Declares the fragments required by this rule for the configuration of the host machine this + * rule's actions execute on. + * + * <p>This is not the same as the rule's configuration. The rule's configuration is its + * <i>target</i> configuration, which determines the platform it builds outputs for. The actions + * created by this rule run on a host machine, which is what the host configuration corresponds + * to. + * + * <p>In contrast to {@link #requiresHostConfigurationFragments(Class...)}, this method takes + * Skylark module names of fragments instead of their classes. + */ + public ConfigAwareRuleClassBuilder requiresHostConfigurationFragmentsBySkylarkModuleName( + Collection<String> configurationFragmentNames) { + ruleClassBuilder.requiresConfigurationFragmentsBySkylarkModuleName(HostTransition.INSTANCE, + configurationFragmentNames); + return this; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/HostTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/HostTransition.java index e593cd7621..099c8fdf2f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/HostTransition.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/HostTransition.java @@ -22,6 +22,11 @@ public final class HostTransition implements PatchTransition { private HostTransition() {} @Override + public boolean isHostTransition() { + return true; + } + + @Override public BuildOptions apply(BuildOptions options) { if (options.get(BuildConfiguration.Options.class).isHost) { // If the input already comes from the host configuration, just return the existing values. |