diff options
author | 2017-02-02 22:54:54 +0000 | |
---|---|---|
committer | 2017-02-03 10:25:51 +0000 | |
commit | cf40c3d90f542a3920bd2fcfbf9943953d5a287b (patch) | |
tree | 80622b40e66a85bc38d31389b60bebbc910b96c2 | |
parent | cecd6edfcfbcf2333f615ee295fb5cd63bdd54d3 (diff) |
Fixing Blaze crashing when using --experimental_objc_crosstool=all with objc_proto_library and objc_import rules.
--
PiperOrigin-RevId: 146410669
MOS_MIGRATED_REVID=146410669
5 files changed, 28 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java index ab1e143fe9..6f9e6f0c94 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java @@ -19,6 +19,7 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.util.FileType; /** @@ -34,7 +35,11 @@ public final class PrecompiledFiles { * rule (this is the most common usage for this class). */ public PrecompiledFiles(RuleContext ruleContext) { - this.files = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); + if (ruleContext.attributes().has("srcs", BuildType.LABEL_LIST)) { + this.files = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); + } else { + this.files = ImmutableList.<Artifact>of(); + } } public Iterable<Artifact> getLibraries() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java index eb98b609f0..ec2a756c98 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper; @@ -75,8 +76,6 @@ public class CrosstoolCompilationSupport extends CompilationSupport { "c-compile", "c++-compile"); - private CompilationArtifacts compilationArtifacts; - /** * Creates a new CompilationSupport instance that uses the c++ rule backend * @@ -103,7 +102,6 @@ public class CrosstoolCompilationSupport extends CompilationSupport { IntermediateArtifacts intermediateArtifacts, CompilationAttributes compilationAttributes) { super(ruleContext, buildConfiguration, intermediateArtifacts, compilationAttributes); - this.compilationArtifacts = compilationArtifacts(ruleContext); } @Override @@ -127,11 +125,11 @@ public class CrosstoolCompilationSupport extends CompilationSupport { extension.addVariableCategory(VariableCategory.ARCHIVE_VARIABLES); - helper = createCcLibraryHelper(objcProvider, extension.build()) + helper = createCcLibraryHelper(objcProvider, compilationArtifacts, extension.build()) .setLinkType(LinkTargetType.OBJC_ARCHIVE) .addLinkActionInput(objList); } else { - helper = createCcLibraryHelper(objcProvider, extension.build()); + helper = createCcLibraryHelper(objcProvider, compilationArtifacts, extension.build()); } helper.build(); @@ -240,9 +238,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { return this; } - private CcLibraryHelper createCcLibraryHelper(ObjcProvider objcProvider, - VariablesExtension extension) { + CompilationArtifacts compilationArtifacts, VariablesExtension extension) { PrecompiledFiles precompiledFiles = new PrecompiledFiles(ruleContext); Collection<Artifact> arcSources = ImmutableSortedSet.copyOf(compilationArtifacts.getSrcs()); Collection<Artifact> nonArcSources = @@ -265,6 +262,10 @@ public class CrosstoolCompilationSupport extends CompilationSupport { .addPublicHeaders(publicHdrs) .addPrecompiledFiles(precompiledFiles) .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) + // Not all our dependencies need to export cpp information. + // For example, objc_proto_library can depend on a proto_library rule that does not + // generate C++ protos. + .setCheckDepsGenerateCpp(false) .addCopts(getCompileRuleCopts()) .addIncludeDirs(objcProvider.get(INCLUDE)) .addCopts(ruleContext.getFragment(ObjcConfiguration.class).getCoptsForCompilationMode()) @@ -273,7 +274,10 @@ public class CrosstoolCompilationSupport extends CompilationSupport { .setPropagateModuleMapToCompileAction(false) .addVariableExtension(extension); - Artifact pchHdr = ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET); + Artifact pchHdr = null; + if (ruleContext.attributes().has("pch", BuildType.LABEL)) { + pchHdr = ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET); + } if (pchHdr != null) { result.addNonModuleMapHeader(pchHdr); } @@ -309,7 +313,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { activatedCrosstoolSelectables.add(NO_ENABLE_MODULES_FEATURE_NAME); } - if (ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET) != null) { + if (ruleContext.attributes().has("pch", BuildType.LABEL) + && ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET) != null) { activatedCrosstoolSelectables.add("pch"); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java index 64070dbac4..09c2e11ff0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.proto.ProtoSourceFileBlacklist; import com.google.devtools.build.lib.util.FileType; @@ -65,7 +66,8 @@ public class ObjcProtoLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, AppleConfiguration.class) + .requiresConfigurationFragments( + CppConfiguration.class, ObjcConfiguration.class, AppleConfiguration.class) /* <!-- #BLAZE_RULE(objc_proto_library).ATTRIBUTE(deps) --> The directly depended upon proto_library rules. <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ @@ -157,7 +159,7 @@ public class ObjcProtoLibraryRule implements RuleDefinition { .name("objc_proto_library") .factoryClass(ObjcProtoLibrary.class) .ancestors(BaseRuleClasses.RuleBase.class, ObjcRuleClasses.LibtoolRule.class, - ObjcRuleClasses.XcrunRule.class) + ObjcRuleClasses.XcrunRule.class, ObjcRuleClasses.CrosstoolRule.class) .build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java index 38d1a5b631..9910608a9d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.StringSequenceBuilder; @@ -117,7 +118,8 @@ class ObjcVariablesExtension implements VariablesExtension { } private void addPchVariables(CcToolchainFeatures.Variables.Builder builder) { - if (ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET) != null) { + if (ruleContext.attributes().has("pch", BuildType.LABEL) + && ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET) != null) { builder.addStringVariable( PCH_FILE_VARIABLE_NAME, ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET).getExecPathString()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java index 61abb70618..da7f0dfcaa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java @@ -98,8 +98,7 @@ final class ProtocolBuffers2Support { public ProtocolBuffers2Support registerCompilationActions() throws RuleErrorException, InterruptedException { CompilationSupport.create(ruleContext) - .registerCompileAndArchiveActions(getCommon()) - .registerGenerateModuleMapAction(getCompilationArtifacts()); + .registerCompileAndArchiveActions(getCommon()); return this; } |