aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Sergio Campama <kaipi@google.com>2016-07-13 14:07:24 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-07-14 11:11:50 +0000
commit5d07f0b2a597c0277f8d3c8008bbd8373c9b5ff9 (patch)
tree537c5411c0a1a149f3ddc8002a062b177085a49f /src
parentc504e4a5e51a87501051e9793dbc69c54c5a9582 (diff)
Fixes Xcodegen when using --experimental_auto_top_level_union_objc_protos.
-- MOS_MIGRATED_REVID=127313628
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java59
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ProtoSupport.java27
3 files changed, 88 insertions, 49 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index b013d604fe..8579bb4966 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -75,12 +75,39 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
@Override
public final ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
- ObjcCommon common = common(ruleContext);
+ ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
+
+ ObjcProvider protosObjcProvider = null;
+ XcodeProvider protosXcodeProvider = null;
+
+ if (objcConfiguration.experimentalAutoTopLevelUnionObjCProtos()) {
+ XcodeProvider.Builder protosXcodeProviderBuilder = new XcodeProvider.Builder();
+ ProtoSupport protoSupport = new ProtoSupport(ruleContext, TargetType.LINKING_TARGET)
+ .registerActions()
+ .addXcodeProviderOptions(protosXcodeProviderBuilder);
+
+ ObjcCommon protoCommon = protoSupport.getCommon();
+ protosObjcProvider = protoCommon.getObjcProvider();
+
+ new CompilationSupport(
+ ruleContext,
+ protoSupport.getIntermediateArtifacts(),
+ new CompilationAttributes.Builder().build())
+ .registerCompileAndArchiveActions(protoCommon, protoSupport.getUserHeaderSearchPaths())
+ .addXcodeSettings(protosXcodeProviderBuilder, protoCommon);
+ protosXcodeProvider = protosXcodeProviderBuilder.build();
+ }
+
+ ObjcCommon common = common(ruleContext, protosObjcProvider);
ObjcProvider objcProvider = common.getObjcProvider();
assertLibraryOrSources(objcProvider, ruleContext);
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
+ if (protosXcodeProvider != null) {
+ xcodeProviderBuilder.addPropagatedDependencies(
+ ImmutableList.of(protosXcodeProvider));
+ }
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
@@ -102,21 +129,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
.build();
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
- if (objcConfiguration.experimentalAutoTopLevelUnionObjCProtos()) {
- ProtoSupport protoSupport =
- new ProtoSupport(ruleContext, TargetType.LINKING_TARGET)
- .registerActions()
- .addXcodeProviderOptions(xcodeProviderBuilder);
-
- ObjcCommon protoCommon = protoSupport.getCommon();
- new CompilationSupport(
- ruleContext,
- protoSupport.getIntermediateArtifacts(),
- new CompilationAttributes.Builder().build())
- .registerCompileAndArchiveActions(protoCommon, protoSupport.getUserHeaderSearchPaths());
- }
-
CompilationSupport compilationSupport =
new CompilationSupport(ruleContext)
.registerCompileAndArchiveActions(common)
@@ -210,7 +222,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
}
}
- private ObjcCommon common(RuleContext ruleContext) {
+ private ObjcCommon common(RuleContext ruleContext, ObjcProvider protosObjcProvider) {
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
CompilationArtifacts compilationArtifacts =
@@ -242,9 +254,8 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
builder.setLinkmapFile(intermediateArtifacts.linkmap());
}
- if (ObjcRuleClasses.objcConfiguration(ruleContext).experimentalAutoTopLevelUnionObjCProtos()) {
- ProtoSupport protoSupport = new ProtoSupport(ruleContext, TargetType.LINKING_TARGET);
- builder.addExtraImportLibraries(protoSupport.getCommon().getCompiledArchive().asSet());
+ if (protosObjcProvider != null) {
+ builder.addDepObjcProviders(ImmutableList.of(protosObjcProvider));
}
return builder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 3d2eb972ec..5e22cd713c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -18,7 +18,6 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.STORYBOARD;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XCDATAMODEL;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
@@ -84,7 +83,30 @@ public final class IosTest implements RuleConfiguredTargetFactory {
@Override
public final ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
- ObjcCommon common = common(ruleContext);
+ ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
+
+ ObjcProvider protosObjcProvider = null;
+ XcodeProvider protosXcodeProvider = null;
+
+ if (objcConfiguration.experimentalAutoTopLevelUnionObjCProtos()) {
+ XcodeProvider.Builder protosXcodeProviderBuilder = new XcodeProvider.Builder();
+ ProtoSupport protoSupport = new ProtoSupport(ruleContext, TargetType.LINKING_TARGET)
+ .registerActions()
+ .addXcodeProviderOptions(protosXcodeProviderBuilder);
+
+ ObjcCommon protoCommon = protoSupport.getCommon();
+ protosObjcProvider = protoCommon.getObjcProvider();
+
+ new CompilationSupport(
+ ruleContext,
+ protoSupport.getIntermediateArtifacts(),
+ new CompilationAttributes.Builder().build())
+ .registerCompileAndArchiveActions(protoCommon, protoSupport.getUserHeaderSearchPaths())
+ .addXcodeSettings(protosXcodeProviderBuilder, protoCommon);
+ protosXcodeProvider = protosXcodeProviderBuilder.build();
+ }
+
+ ObjcCommon common = common(ruleContext, protosObjcProvider);
if (!common.getCompilationArtifacts().get().getArchive().isPresent()) {
ruleContext.ruleError(REQUIRES_SOURCE_ERROR);
@@ -95,22 +117,13 @@ public final class IosTest implements RuleConfiguredTargetFactory {
}
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
+ if (protosXcodeProvider != null) {
+ xcodeProviderBuilder.addPropagatedDependencies(
+ ImmutableList.of(protosXcodeProvider));
+ }
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
addResourceFilesToBuild(ruleContext, common.getObjcProvider(), filesToBuild);
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
- if (objcConfiguration.experimentalAutoTopLevelUnionObjCProtos()) {
- ProtoSupport protoSupport =
- new ProtoSupport(ruleContext, TargetType.LINKING_TARGET).registerActions();
-
- ObjcCommon protoCommon = protoSupport.getCommon();
- new CompilationSupport(
- ruleContext,
- protoSupport.getIntermediateArtifacts(),
- new CompilationAttributes.Builder().build())
- .registerCompileAndArchiveActions(protoCommon, protoSupport.getUserHeaderSearchPaths());
- }
-
XcodeProductType productType = getProductType(ruleContext);
ExtraLinkArgs extraLinkArgs;
Iterable<Artifact> extraLinkInputs;
@@ -254,19 +267,10 @@ public final class IosTest implements RuleConfiguredTargetFactory {
/**
* Constructs an {@link ObjcCommon} instance based on the attributes.
*/
- private ObjcCommon common(RuleContext ruleContext) {
+ private ObjcCommon common(RuleContext ruleContext, ObjcProvider protosObjcProvider) {
CompilationArtifacts compilationArtifacts =
CompilationSupport.compilationArtifacts(ruleContext);
- Optional<Artifact> protoLib;
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
- if (objcConfiguration.experimentalAutoTopLevelUnionObjCProtos()) {
- ProtoSupport protoSupport = new ProtoSupport(ruleContext, TargetType.LINKING_TARGET);
- protoLib = protoSupport.getCommon().getCompiledArchive();
- } else {
- protoLib = Optional.absent();
- }
-
ObjcCommon.Builder builder =
new ObjcCommon.Builder(ruleContext)
.setCompilationAttributes(
@@ -281,7 +285,6 @@ public final class IosTest implements RuleConfiguredTargetFactory {
ruleContext.getPrerequisites(
"non_propagated_deps", Mode.TARGET, ObjcProvider.class))
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
- .addExtraImportLibraries(protoLib.asSet())
.setHasModuleMap();
if (isXcTest(ruleContext)) {
@@ -290,6 +293,10 @@ public final class IosTest implements RuleConfiguredTargetFactory {
.addDepObjcProviders(ImmutableList.of(xcTestAppProvider(ruleContext).getObjcProvider()));
}
+ if (protosObjcProvider != null) {
+ builder.addDepObjcProviders(ImmutableList.of(protosObjcProvider));
+ }
+
// Add the memleaks library if the --ios_memleaks flag is true. The library pauses the test
// after all tests have been executed so that leaks can be run.
ObjcConfiguration config = ruleContext.getFragment(ObjcConfiguration.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtoSupport.java
index d53d37dc47..7d87d3a1ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtoSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtoSupport.java
@@ -33,8 +33,11 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
+import com.google.devtools.build.lib.cmdline.Label;
+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.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
@@ -236,12 +239,30 @@ final class ProtoSupport {
* @param xcodeProviderBuilder The builder for the XcodeProvider support class.
* @return this proto support
*/
- public ProtoSupport addXcodeProviderOptions(XcodeProvider.Builder xcodeProviderBuilder) {
+ public ProtoSupport addXcodeProviderOptions(XcodeProvider.Builder xcodeProviderBuilder)
+ throws RuleErrorException {
xcodeProviderBuilder
.addUserHeaderSearchPaths(getUserHeaderSearchPaths())
- .addCopts(ObjcRuleClasses.objcConfiguration(ruleContext).getCopts())
.addHeaders(getGeneratedHeaders())
.setCompilationArtifacts(getCompilationArtifacts());
+
+ if (targetType == TargetType.PROTO_TARGET) {
+ xcodeProviderBuilder.addCopts(ObjcRuleClasses.objcConfiguration(ruleContext).getCopts());
+ } else if (targetType == TargetType.LINKING_TARGET) {
+ Label protosLabel = null;
+ try {
+ protosLabel = ruleContext.getLabel().getLocalTargetLabel(
+ ruleContext.getLabel().getName() + "_BundledProtos");
+ } catch (LabelSyntaxException e) {
+ ruleContext.throwWithRuleError(e.getLocalizedMessage());
+ }
+ ObjcCommon protoCommon = getCommon();
+ new XcodeSupport(ruleContext, intermediateArtifacts, protosLabel)
+ .addXcodeSettings(xcodeProviderBuilder,
+ protoCommon.getObjcProvider(),
+ XcodeProductType.LIBRARY_STATIC)
+ .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET));
+ }
return this;
}
@@ -272,7 +293,7 @@ final class ProtoSupport {
}
if (experimentalAutoUnion()) {
- if (targetType == TargetType.PROTO_TARGET && !usesProtobufLibrary()
+ if ((targetType == TargetType.PROTO_TARGET && !usesProtobufLibrary())
|| targetType == TargetType.LINKING_TARGET) {
builder.addNonArcSrcs(generatedSources);
}