diff options
author | rosica <rosica@google.com> | 2018-08-07 04:40:40 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-07 04:42:01 -0700 |
commit | 473ea10c0dc76f3760f4f4afd3adb3b40b40abdb (patch) | |
tree | a48ecdbb3fc87012d98111e6e753d6c79fcf5888 /src/main | |
parent | 6eefeb04b900be29d96a87dcdc3938151d98d9bf (diff) |
Pass cc_toolchain location to FeatureConfiguration
Paths to tools in CROSSTOOL are either absolute or relative to the CROSSTOOL location (which is the same as cc_toolchain location). As in the future CROSSTOOL will be gone, and the new skylark rule that will replace CROSSTOOL will not have to be in the same location as cc_toolchain, we need to pass information to FeatureConfiguration about the location of the cc_toolchain in use, so we can calculate the workspace relative paths to the tools.
RELNOTES: None.
PiperOrigin-RevId: 207695703
Diffstat (limited to 'src/main')
12 files changed, 68 insertions, 52 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java index fee468a2dc..ff0a6e3691 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java @@ -138,10 +138,7 @@ public class CcModule @Override public String getToolForAction(FeatureConfiguration featureConfiguration, String actionName) { - return featureConfiguration - .getToolForAction(actionName) - .getToolPathFragment() - .getSafePathString(); + return featureConfiguration.getToolPathForAction(actionName); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java index ddf2a7f1e6..f49c8d51af 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java @@ -659,9 +659,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory { toolchain, cppConfiguration.getCrosstoolTopPathFragment()); CcToolchainConfigInfo ccToolchainConfigInfo = CcToolchainConfigInfo.fromToolchain( - cppConfiguration.getCrosstoolFile().getProto(), - toolchain, - cppConfiguration.getCrosstoolTopPathFragment()); + cppConfiguration.getCrosstoolFile().getProto(), toolchain); return CppToolchainInfo.create( cppConfiguration.getCrosstoolTopPathFragment(), cppConfiguration.getCcToolchainRuleLabel(), diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java index d9b81a510c..032bae9206 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java @@ -24,7 +24,6 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ArtifactNameP import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Feature; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.Pair; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationModeFlags; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease; @@ -188,13 +187,12 @@ public class CcToolchainConfigInfo extends NativeInfo { this.hasDynamicLinkingModeFlags = hasDynamicLinkingModeFlags; } - public static CcToolchainConfigInfo fromToolchain( - CrosstoolRelease file, CToolchain toolchain, PathFragment crosstoolTop) + public static CcToolchainConfigInfo fromToolchain(CrosstoolRelease file, CToolchain toolchain) throws InvalidConfigurationException { ImmutableList.Builder<ActionConfig> actionConfigBuilder = ImmutableList.builder(); for (CToolchain.ActionConfig actionConfig : toolchain.getActionConfigList()) { - actionConfigBuilder.add(new ActionConfig(actionConfig, crosstoolTop)); + actionConfigBuilder.add(new ActionConfig(actionConfig)); } ImmutableList.Builder<Feature> featureBuilder = ImmutableList.builder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java index 8281304e35..610867d6fc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java @@ -832,10 +832,9 @@ public class CcToolchainFeatures implements Serializable { private Tool( CToolchain.Tool tool, - PathFragment crosstoolTop, ImmutableSet<WithFeatureSet> withFeatureSetSets) { this.withFeatureSetSets = withFeatureSetSets; - toolPathFragment = crosstoolTop.getRelative(tool.getToolPath()); + this.toolPathFragment = PathFragment.create(tool.getToolPath()); executionRequirements = ImmutableSet.copyOf(tool.getExecutionRequirementList()); } @@ -850,8 +849,8 @@ public class CcToolchainFeatures implements Serializable { } /** Returns the path to this action's tool relative to the provided crosstool path. */ - public PathFragment getToolPathFragment() { - return toolPathFragment; + public String getToolPathString(PathFragment ccToolchainPath) { + return ccToolchainPath.getRelative(toolPathFragment).getSafePathString(); } /** @@ -907,8 +906,7 @@ public class CcToolchainFeatures implements Serializable { private final boolean enabled; private final ImmutableList<String> implies; - ActionConfig(CToolchain.ActionConfig actionConfig, PathFragment crosstoolTop) - throws InvalidConfigurationException { + ActionConfig(CToolchain.ActionConfig actionConfig) throws InvalidConfigurationException { this.configName = actionConfig.getConfigName(); this.actionName = actionConfig.getActionName(); this.tools = @@ -919,7 +917,6 @@ public class CcToolchainFeatures implements Serializable { t -> new Tool( t, - crosstoolTop, t.getWithFeatureList() .stream() .map(f -> new WithFeatureSet(f)) @@ -1117,6 +1114,8 @@ public class CcToolchainFeatures implements Serializable { private final ImmutableMap<String, ActionConfig> actionConfigByActionName; + private final PathFragment ccToolchainPath; + /** * {@link FeatureConfiguration} instance that doesn't produce any command lines. This is to be * used when creation of the real {@link FeatureConfiguration} failed, the rule error was @@ -1126,23 +1125,32 @@ public class CcToolchainFeatures implements Serializable { FEATURE_CONFIGURATION_INTERNER.intern(new FeatureConfiguration()); protected FeatureConfiguration() { - this(ImmutableList.of(), ImmutableSet.of(), ImmutableMap.of()); + this( + /* enabledFeatures= */ ImmutableList.of(), + /* enabledActionConfigActionNames= */ ImmutableSet.of(), + /* actionConfigByActionName= */ ImmutableMap.of(), + /* ccToolchainPath= */ PathFragment.EMPTY_FRAGMENT); } @AutoCodec.Instantiator static FeatureConfiguration createForSerialization( ImmutableList<Feature> enabledFeatures, ImmutableSet<String> enabledActionConfigActionNames, - ImmutableMap<String, ActionConfig> actionConfigByActionName) { + ImmutableMap<String, ActionConfig> actionConfigByActionName, + PathFragment ccToolchainPath) { return FEATURE_CONFIGURATION_INTERNER.intern( new FeatureConfiguration( - enabledFeatures, enabledActionConfigActionNames, actionConfigByActionName)); + enabledFeatures, + enabledActionConfigActionNames, + actionConfigByActionName, + ccToolchainPath)); } FeatureConfiguration( ImmutableList<Feature> enabledFeatures, ImmutableSet<String> enabledActionConfigActionNames, - ImmutableMap<String, ActionConfig> actionConfigByActionName) { + ImmutableMap<String, ActionConfig> actionConfigByActionName, + PathFragment ccToolchainPath) { this.enabledFeatures = enabledFeatures; this.actionConfigByActionName = actionConfigByActionName; @@ -1152,6 +1160,7 @@ public class CcToolchainFeatures implements Serializable { } this.enabledFeatureNames = featureBuilder.build(); this.enabledActionConfigActionNames = enabledActionConfigActionNames; + this.ccToolchainPath = ccToolchainPath; } /** @@ -1228,14 +1237,22 @@ public class CcToolchainFeatures implements Serializable { return envBuilder.build(); } - /** Returns a given action's tool under this FeatureConfiguration. */ - public Tool getToolForAction(String actionName) { + String getToolPathForAction(String actionName) { + Preconditions.checkArgument( + actionConfigByActionName.containsKey(actionName), + "Action %s does not have an enabled configuration in the toolchain.", + actionName); + ActionConfig actionConfig = actionConfigByActionName.get(actionName); + return actionConfig.getTool(enabledFeatureNames).getToolPathString(ccToolchainPath); + } + + ImmutableSet<String> getToolRequirementsForAction(String actionName) { Preconditions.checkArgument( actionConfigByActionName.containsKey(actionName), "Action %s does not have an enabled configuration in the toolchain.", actionName); ActionConfig actionConfig = actionConfigByActionName.get(actionName); - return actionConfig.getTool(enabledFeatureNames); + return actionConfig.getTool(enabledFeatureNames).getExecutionRequirements(); } @Override @@ -1335,14 +1352,18 @@ public class CcToolchainFeatures implements Serializable { private transient LoadingCache<ImmutableSet<String>, FeatureConfiguration> configurationCache = buildConfigurationCache(); + private PathFragment ccToolchainPath; + /** - * Constructs the feature configuration from a {@code crosstoolInfo}. + * Constructs the feature configuration from a {@link CcToolchainConfigInfo}. * * @param ccToolchainConfigInfo the toolchain information as specified by the user. + * @param ccToolchainPath location of the cc_toolchain. * @throws InvalidConfigurationException if the configuration has logical errors. */ @VisibleForTesting - public CcToolchainFeatures(CcToolchainConfigInfo ccToolchainConfigInfo) + public CcToolchainFeatures( + CcToolchainConfigInfo ccToolchainConfigInfo, PathFragment ccToolchainPath) throws InvalidConfigurationException { // Build up the feature/action config graph. We refer to features/action configs as // 'selectables'. @@ -1432,6 +1453,7 @@ public class CcToolchainFeatures implements Serializable { this.provides = provides.build().inverse(); this.impliedBy = impliedBy.build(); this.requiredBy = requiredBy.build(); + this.ccToolchainPath = ccToolchainPath; } private static void checkForActivatableDups(Iterable<CrosstoolSelectable> selectables) @@ -1529,7 +1551,8 @@ public class CcToolchainFeatures implements Serializable { impliedBy, requires, requiredBy, - actionConfigsByActionName) + actionConfigsByActionName, + ccToolchainPath) .run(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java index 878391f2b3..bf0f55b62a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLine.java @@ -73,7 +73,7 @@ public final class CompileCommandLine { featureConfiguration.actionIsConfigured(actionName), "Expected action_config for '%s' to be configured", actionName); - return featureConfiguration.getToolForAction(actionName).getToolPathFragment().getPathString(); + return featureConfiguration.getToolPathForAction(actionName); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java index 6c079747ab..36be89ef59 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java @@ -273,7 +273,7 @@ public class CppCompileActionBuilder { if (featureConfiguration.actionIsConfigured(getActionName())) { for (String executionRequirement : - featureConfiguration.getToolForAction(getActionName()).getExecutionRequirements()) { + featureConfiguration.getToolRequirementsForAction(getActionName())) { executionInfo.put(executionRequirement, ""); } } else { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java index 37d033794e..c33574b3ef 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationLoader.java @@ -256,10 +256,7 @@ public class CppConfigurationLoader implements ConfigurationFragmentFactory { toolchain, crosstoolTopLabel.getPackageIdentifier().getPathUnderExecRoot()); CcToolchainConfigInfo ccToolchainConfigInfo = - CcToolchainConfigInfo.fromToolchain( - file.getProto(), - toolchain, - crosstoolTopLabel.getPackageIdentifier().getPathUnderExecRoot()); + CcToolchainConfigInfo.fromToolchain(file.getProto(), toolchain); Label sysrootLabel = getSysrootLabel(toolchain, cppOptions.libcTopLabel); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 6046612b2b..62ff6dcdc4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -57,7 +57,6 @@ import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory. import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Linkstamp; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; -import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Tool; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.shell.ShellUtils; import com.google.devtools.build.lib.syntax.Type; @@ -669,8 +668,6 @@ public class CppHelper { return; } - Tool stripTool = - Preconditions.checkNotNull(featureConfiguration.getToolForAction(CppActionNames.STRIP)); CcToolchainVariables variables = new CcToolchainVariables.Builder(toolchain.getBuildVariables()) .addStringVariable( @@ -682,7 +679,8 @@ public class CppHelper { ImmutableList<String> commandLine = ImmutableList.copyOf(featureConfiguration.getCommandLine(CppActionNames.STRIP, variables)); ImmutableMap.Builder<String, String> executionInfoBuilder = ImmutableMap.builder(); - for (String executionRequirement : stripTool.getExecutionRequirements()) { + for (String executionRequirement : + featureConfiguration.getToolRequirementsForAction(CppActionNames.STRIP)) { executionInfoBuilder.put(executionRequirement, ""); } Action[] stripAction = @@ -691,7 +689,9 @@ public class CppHelper { .addTransitiveInputs(toolchain.getStrip()) .addOutput(output) .useDefaultShellEnvironment() - .setExecutable(stripTool.getToolPathFragment()) + .setExecutable( + PathFragment.create( + featureConfiguration.getToolPathForAction(CppActionNames.STRIP))) .setExecutionInfo(executionInfoBuilder.build()) .setProgressMessage("Stripping %s for %s", output.prettyPrint(), context.getLabel()) .setMnemonic("CcStrip") diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java index 8a99e731a3..c5ebe364f5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java @@ -1080,7 +1080,7 @@ public class CppLinkActionBuilder { ImmutableSet.Builder<String> executionRequirements = ImmutableSet.builder(); if (featureConfiguration.actionIsConfigured(getActionName())) { executionRequirements.addAll( - featureConfiguration.getToolForAction(getActionName()).getExecutionRequirements()); + featureConfiguration.getToolRequirementsForAction(getActionName())); } if (!isLtoIndexing) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java index 9abfe87929..a7a6cb73de 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java @@ -300,7 +300,8 @@ public final class CppToolchainInfo { this.crosstoolTopPathFragment = crosstoolTopPathFragment; this.toolchainIdentifier = toolchainIdentifier; // Since this field can be derived from `crosstoolInfo`, it is re-derived instead of serialized. - this.toolchainFeatures = new CcToolchainFeatures(ccToolchainConfigInfo); + this.toolchainFeatures = + new CcToolchainFeatures(ccToolchainConfigInfo, crosstoolTopPathFragment); this.toolPaths = toolPaths; this.compiler = compiler; this.abiGlibcVersion = abiGlibcVersion; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureSelection.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureSelection.java index 774042b6fb..a4fb17747e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureSelection.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FeatureSelection.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.CollidingProv import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.CrosstoolSelectable; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Feature; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; +import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; @@ -101,6 +102,9 @@ class FeatureSelection { */ private final ImmutableMultimap<CrosstoolSelectable, CrosstoolSelectable> requiredBy; + /** Location of the cc_toolchain in use. */ + private final PathFragment ccToolchainPath; + FeatureSelection( ImmutableSet<String> requestedFeatures, ImmutableMap<String, CrosstoolSelectable> selectablesByName, @@ -110,7 +114,8 @@ class FeatureSelection { ImmutableMultimap<CrosstoolSelectable, CrosstoolSelectable> impliedBy, ImmutableMultimap<CrosstoolSelectable, ImmutableSet<CrosstoolSelectable>> requires, ImmutableMultimap<CrosstoolSelectable, CrosstoolSelectable> requiredBy, - ImmutableMap<String, ActionConfig> actionConfigsByActionName) { + ImmutableMap<String, ActionConfig> actionConfigsByActionName, + PathFragment ccToolchainPath) { ImmutableSet.Builder<CrosstoolSelectable> builder = ImmutableSet.builder(); for (String name : requestedFeatures) { if (selectablesByName.containsKey(name)) { @@ -125,6 +130,7 @@ class FeatureSelection { this.requires = requires; this.requiredBy = requiredBy; this.actionConfigsByActionName = actionConfigsByActionName; + this.ccToolchainPath = ccToolchainPath; } /** @@ -179,7 +185,10 @@ class FeatureSelection { } return new FeatureConfiguration( - enabledFeaturesInOrder, enabledActionConfigNames.build(), actionConfigsByActionName); + enabledFeaturesInOrder, + enabledActionConfigNames.build(), + actionConfigsByActionName, + ccToolchainPath); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java index dab8b57ec4..2b85f2463f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java @@ -126,10 +126,7 @@ public final class LinkCommandLine extends CommandLine { /** Returns the path to the linker. */ public String getLinkerPathString() { - return featureConfiguration - .getToolForAction(linkTargetType.getActionName()) - .getToolPathFragment() - .getPathString(); + return featureConfiguration.getToolPathForAction(linkTargetType.getActionName()); } /** @@ -377,11 +374,7 @@ public final class LinkCommandLine extends CommandLine { Preconditions.checkArgument( featureConfiguration.actionIsConfigured(actionName), String.format("Expected action_config for '%s' to be configured", actionName)); - argv.add( - featureConfiguration - .getToolForAction(linkTargetType.getActionName()) - .getToolPathFragment() - .getPathString()); + argv.add(featureConfiguration.getToolPathForAction(linkTargetType.getActionName())); } argv.addAll(featureConfiguration.getCommandLine(actionName, variables, expander)); return argv; |