diff options
author | 2016-07-13 14:07:24 +0000 | |
---|---|---|
committer | 2016-07-14 11:11:50 +0000 | |
commit | 5d07f0b2a597c0277f8d3c8008bbd8373c9b5ff9 (patch) | |
tree | 537c5411c0a1a149f3ddc8002a062b177085a49f /src | |
parent | c504e4a5e51a87501051e9793dbc69c54c5a9582 (diff) |
Fixes Xcodegen when using --experimental_auto_top_level_union_objc_protos.
--
MOS_MIGRATED_REVID=127313628
Diffstat (limited to 'src')
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); } |