From df36eef6464421bc3c2e824c132af902d2c5482a Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 10 Dec 2015 18:00:46 +0000 Subject: Allows cc_{library, binary} targets to depend on objc_library. -- MOS_MIGRATED_REVID=109909215 --- .../lib/rules/objc/BinaryLinkingTargetFactory.java | 4 +- .../devtools/build/lib/rules/objc/ObjcCommon.java | 16 ++++++- .../devtools/build/lib/rules/objc/ObjcLibrary.java | 49 +++++++++++++++++++--- 3 files changed, 58 insertions(+), 11 deletions(-) (limited to 'src/main/java/com/google/devtools/build') 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 233d02a8c7..44b949c5fc 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 @@ -31,7 +31,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.Platform; -import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; @@ -200,8 +199,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class)) .addDepCcHeaderProviders( ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class)) - .addDepCcLinkProviders( - ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class)) + .addDepCcLinkProviders(ruleContext) .addDepObjcProviders( ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) .addNonPropagatedDepObjcProviders( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 4e46a59ac9..5528fecee3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -60,6 +60,7 @@ import com.google.common.collect.UnmodifiableIterator; 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.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -68,6 +69,7 @@ import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; +import com.google.devtools.build.lib.rules.cpp.CppRunfilesProvider; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; @@ -443,8 +445,18 @@ public final class ObjcCommon { /** * Sets information from {@code cc_library} dependencies to be used during linking. */ - public Builder addDepCcLinkProviders(Iterable depCcLinkProviders) { - this.depCcLinkProviders = Iterables.concat(this.depCcLinkProviders, depCcLinkProviders); + public Builder addDepCcLinkProviders(RuleContext ruleContext) { + for (TransitiveInfoCollection dep : ruleContext.getPrerequisites("deps", Mode.TARGET)) { + // Hack to determine if dep is a cc target. Required so objc_library archives packed in + // CcLinkParamsProvider do not get consumed as cc targets. + if (dep.getProvider(CppRunfilesProvider.class) != null) { + CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class); + this.depCcLinkProviders = + Iterables.concat( + this.depCcLinkProviders, + ImmutableList.of(ccLinkParamsProvider)); + } + } return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index 0cea1618bd..34a6305483 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -17,14 +17,19 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; +import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; +import com.google.devtools.build.lib.rules.cpp.LinkerInputs; +import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; @@ -50,6 +55,33 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { } } + /** + * A {@link CcLinkParamsStore} to be propagated to dependent cc_{library, binary} targets. + */ + private static class ObjcLibraryCcLinkParamsStore extends CcLinkParamsStore { + + private ObjcCommon common; + + public ObjcLibraryCcLinkParamsStore(ObjcCommon common) { + this.common = common; + } + + @Override + protected void collect( + CcLinkParams.Builder builder, boolean linkingStatically, boolean linkShared) { + ObjcProvider objcProvider = common.getObjcProvider(); + + ImmutableSet.Builder libraries = new ImmutableSet.Builder<>(); + for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY)) { + libraries.add(LinkerInputs.opaqueLibraryToLink(library)); + } + + libraries.addAll(objcProvider.get(ObjcProvider.CC_LIBRARY)); + + builder.addLibraries(libraries.build()); + } + } + /** * Constructs an {@link ObjcCommon} instance based on the attributes of the given rule. The rule * should inherit from {@link ObjcLibraryRule}.. @@ -73,8 +105,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class)) .addDepCcHeaderProviders( ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class)) - .addDepCcLinkProviders( - ruleContext.getPrerequisites("deps", Mode.TARGET, CcLinkParamsProvider.class)) + .addDepCcLinkProviders(ruleContext) .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) .setAlwayslink(alwayslink) .setHasModuleMap() @@ -85,10 +116,13 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException { - ObjcCommon common = common( - ruleContext, ImmutableList.of(), - ruleContext.attributes().get("alwayslink", Type.BOOLEAN), new ExtraImportLibraries(), - ImmutableList.of()); + final ObjcCommon common = + common( + ruleContext, + ImmutableList.of(), + ruleContext.attributes().get("alwayslink", Type.BOOLEAN), + new ExtraImportLibraries(), + ImmutableList.of()); XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder(); NestedSetBuilder filesToBuild = NestedSetBuilder.stableOrder() @@ -122,6 +156,9 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { .addProvider( InstrumentedFilesProvider.class, compilationSupport.getInstrumentedFilesProvider(common)) + .addProvider( + CcLinkParamsProvider.class, + new CcLinkParamsProvider(new ObjcLibraryCcLinkParamsStore(common))) .build(); } } -- cgit v1.2.3