diff options
author | 2017-12-13 10:17:44 -0800 | |
---|---|---|
committer | 2017-12-13 10:19:39 -0800 | |
commit | 0c349543eb5551f2eebe6177e72e0041d5415350 (patch) | |
tree | b8dd9f9bfb2d014944bc2b6628da51211febac5d /src/main/java/com/google/devtools/build/lib/rules | |
parent | a9cd97c8075e1d7f3a2662795bde7afffa940dd3 (diff) |
Allow not recognized Artifact category to be handled in Analysis phase
Nonexistent artifact categories or categories that are not supported by the action config now throw InvalidConfigurationException instead of ExpansionException. This allows the checked exception to be caught and reported as a RuleErrorException in Analysis phase.
RELNOTES: None.
PiperOrigin-RevId: 178919727
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
5 files changed, 53 insertions, 27 deletions
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 37db5839fe..c807289a7c 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 @@ -802,9 +802,10 @@ public class CcToolchainFeatures implements Serializable { } } if (foundCategory == null) { - throw new ExpansionException( + throw new InvalidConfigurationException( String.format( - "Artifact category %s not recognized", artifactNamePattern.getCategoryName())); + "Invalid toolchain configuration: Artifact category %s not recognized", + artifactNamePattern.getCategoryName())); } this.artifactCategory = foundCategory; @@ -2053,7 +2054,7 @@ public class CcToolchainFeatures implements Serializable { } /** - * @return the selectable with the given {@code name}. + * @return the selectable with the given {@code name}.s * * @throws InvalidConfigurationException if no selectable with the given name was configured. */ @@ -2074,13 +2075,14 @@ public class CcToolchainFeatures implements Serializable { } return featureNames; } - + /** - * Returns the artifact selected by the toolchain for the given action type and action category, - * or null if the category is not supported by the action config. + * Returns the artifact selected by the toolchain for the given action type and action category. + * + * @throws InvalidConfigurationException if the category is not supported by the action config. */ String getArtifactNameForCategory(ArtifactCategory artifactCategory, String outputName) - throws ExpansionException { + throws InvalidConfigurationException { PathFragment output = PathFragment.create(outputName); ArtifactNamePattern patternForCategory = null; @@ -2090,7 +2092,7 @@ public class CcToolchainFeatures implements Serializable { } } if (patternForCategory == null) { - throw new ExpansionException( + throw new InvalidConfigurationException( String.format( MISSING_ARTIFACT_NAME_PATTERN_ERROR_TEMPLATE, artifactCategory.getCategoryName())); } 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 a079119ab5..815a4a6a8c 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 @@ -584,8 +584,11 @@ public class CppCompileActionBuilder { } public CppCompileActionBuilder setOutputs( - RuleContext ruleContext, ArtifactCategory outputCategory, String outputName, - boolean generateDotd) { + RuleContext ruleContext, + ArtifactCategory outputCategory, + String outputName, + boolean generateDotd) + throws RuleErrorException { this.outputFile = CppHelper.getCompileOutputArtifact( ruleContext, CppHelper.getArtifactNameForCategory(ruleContext, ccToolchain, outputCategory, outputName), diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java index 3a28981443..baeac86ce0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.analysis.actions.ActionTemplate; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -80,13 +81,15 @@ public final class CppCompileActionTemplate implements ActionTemplate<CppCompile throws ActionTemplateExpansionException { ImmutableList.Builder<CppCompileAction> expandedActions = new ImmutableList.Builder<>(); for (TreeFileArtifact inputTreeFileArtifact : inputTreeFileArtifacts) { - String outputName = outputTreeFileArtifactName(inputTreeFileArtifact); - TreeFileArtifact outputTreeFileArtifact = ActionInputHelper.treeFileArtifact( - outputTreeArtifact, - PathFragment.create(outputName), - artifactOwner); - - expandedActions.add(createAction(inputTreeFileArtifact, outputTreeFileArtifact)); + try { + String outputName = outputTreeFileArtifactName(inputTreeFileArtifact); + TreeFileArtifact outputTreeFileArtifact = + ActionInputHelper.treeFileArtifact( + outputTreeArtifact, PathFragment.create(outputName), artifactOwner); + expandedActions.add(createAction(inputTreeFileArtifact, outputTreeFileArtifact)); + } catch (InvalidConfigurationException e) { + throw new ActionTemplateExpansionException(e); + } } return expandedActions.build(); @@ -120,7 +123,8 @@ public final class CppCompileActionTemplate implements ActionTemplate<CppCompile return result; } - private String outputTreeFileArtifactName(TreeFileArtifact inputTreeFileArtifact) { + private String outputTreeFileArtifactName(TreeFileArtifact inputTreeFileArtifact) + throws InvalidConfigurationException { String outputName = FileSystemUtils.removeExtension( inputTreeFileArtifact.getParentRelativePath().getPathString()); for (ArtifactCategory category : categories) { 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 9392ffafe6..411c1527e4 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 @@ -44,6 +44,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options.MakeVariableSource; import com.google.devtools.build.lib.analysis.config.CompilationMode; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.platform.ToolchainInfo; import com.google.devtools.build.lib.cmdline.Label; @@ -51,6 +52,7 @@ import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; 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; @@ -912,14 +914,26 @@ public class CppHelper { objectDir.getRelative(rootRelativePath), sourceTreeArtifact.getRoot()); } - static String getArtifactNameForCategory(RuleContext ruleContext, CcToolchainProvider toolchain, - ArtifactCategory category, String outputName) { - return toolchain.getFeatures().getArtifactNameForCategory(category, outputName); + static String getArtifactNameForCategory( + RuleContext ruleContext, + CcToolchainProvider toolchain, + ArtifactCategory category, + String outputName) + throws RuleErrorException { + try { + return toolchain.getFeatures().getArtifactNameForCategory(category, outputName); + } catch (InvalidConfigurationException e) { + ruleContext.throwWithRuleError(e.getMessage()); + throw new IllegalStateException("Should not be reached"); + } } static String getDotdFileName( - RuleContext ruleContext, CcToolchainProvider toolchain, ArtifactCategory outputCategory, - String outputName) { + RuleContext ruleContext, + CcToolchainProvider toolchain, + ArtifactCategory outputCategory, + String outputName) + throws RuleErrorException { String baseName = outputCategory == ArtifactCategory.OBJECT_FILE || outputCategory == ArtifactCategory.PROCESSED_HEADER ? outputName diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java index 466b3ceed3..2051817205 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java @@ -1149,7 +1149,7 @@ public final class CppModel { return outputFiles; } - String getOutputNameBaseWith(String base, boolean usePic) { + String getOutputNameBaseWith(String base, boolean usePic) throws RuleErrorException { return usePic ? CppHelper.getArtifactNameForCategory( ruleContext, ccToolchain, ArtifactCategory.PIC_FILE, base) @@ -1529,9 +1529,12 @@ public final class CppModel { * Creates cpp PIC compile action builder from the given builder by adding necessary copt and * changing output and dotd file names. */ - private CppCompileActionBuilder copyAsPicBuilder(CppCompileActionBuilder builder, - String outputName, ArtifactCategory outputCategory, - boolean generateDotd) { + private CppCompileActionBuilder copyAsPicBuilder( + CppCompileActionBuilder builder, + String outputName, + ArtifactCategory outputCategory, + boolean generateDotd) + throws RuleErrorException { CppCompileActionBuilder picBuilder = new CppCompileActionBuilder(builder); picBuilder .setPicMode(true) |