aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Rumou Duan <rduan@google.com>2017-02-02 22:54:54 +0000
committerGravatar Yun Peng <pcloudy@google.com>2017-02-03 10:25:51 +0000
commitcf40c3d90f542a3920bd2fcfbf9943953d5a287b (patch)
tree80622b40e66a85bc38d31389b60bebbc910b96c2
parentcecd6edfcfbcf2333f615ee295fb5cd63bdd54d3 (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
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcVariablesExtension.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java3
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;
}