diff options
author | 2015-10-01 21:55:49 +0000 | |
---|---|---|
committer | 2015-10-02 09:32:25 +0000 | |
commit | ac0f10a9dcd3d482dd060b58c6a41f3767aa0b56 (patch) | |
tree | b38775bc59d5efa560911d3b30470fb23ad4f00e /src | |
parent | 7b4b765a790da9ac9c18ed697ed433b1e2fcf548 (diff) |
Propagates cc_library linkopts attribute to dependent objc_libraries.
--
MOS_MIGRATED_REVID=104439072
Diffstat (limited to 'src')
3 files changed, 29 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index e0d9700cff..6ba0442d15 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -785,6 +785,7 @@ public final class CompilationSupport { .addExecPaths(ccLibraries) .addBeforeEach("-force_load", Artifact.toExecPaths(objcProvider.get(FORCE_LOAD_LIBRARY))) .add(extraLinkArgs) + .add(objcProvider.get(ObjcProvider.LINKOPT)) .build(); if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { @@ -1059,7 +1060,7 @@ public final class CompilationSupport { Set<Artifact> hdrsSet = new HashSet<>(attributes.hdrs()); Set<Artifact> srcsSet = new HashSet<>(ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list()); - + // Check for overlap between srcs and hdrs. for (Artifact header : Sets.intersection(hdrsSet, srcsSet)) { String path = header.getRootRelativePath().toString(); 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 cd65adb3e0..8055a7071d 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 @@ -35,6 +35,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE_SYSTEM; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINKED_BINARY; +import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINKOPT; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.MODULE_MAP; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_DYLIB; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.SDK_FRAMEWORK; @@ -55,12 +56,14 @@ import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +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.config.BuildConfiguration; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.cpp.CcCommon; +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; @@ -473,8 +476,25 @@ public final class ObjcCommon { objcProvider.addAll(DEFINE, headerProvider.getDefines()); } for (CcLinkParamsProvider linkProvider : depCcLinkProviders) { - objcProvider.addTransitiveAndPropagate( - CC_LIBRARY, linkProvider.getCcLinkParams(true, false).getLibraries()); + CcLinkParams params = linkProvider.getCcLinkParams(true, false); + ImmutableList<String> linkOpts = params.flattenedLinkopts(); + ImmutableSet.Builder<SdkFramework> frameworkLinkOpts = new ImmutableSet.Builder<>(); + ImmutableList.Builder<String> nonFrameworkLinkOpts = new ImmutableList.Builder<>(); + // Add any framework flags as frameworks directly, rather than as linkopts. + for (UnmodifiableIterator<String> iterator = linkOpts.iterator(); iterator.hasNext(); ) { + String arg = iterator.next(); + if (arg.equals("-framework") && iterator.hasNext()) { + String framework = iterator.next(); + frameworkLinkOpts.add(new SdkFramework(framework)); + } else { + nonFrameworkLinkOpts.add(arg); + } + } + + objcProvider + .addAll(SDK_FRAMEWORK, frameworkLinkOpts.build()) + .addAll(LINKOPT, nonFrameworkLinkOpts.build()) + .addTransitiveAndPropagate(CC_LIBRARY, params.getLibraries()); } if (compilationAttributes.isPresent()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index 06c4a51adf..85e05dc10f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -208,6 +208,11 @@ public final class ObjcProvider implements TransitiveInfoProvider { public static final Key<LinkerInputs.LibraryToLink> CC_LIBRARY = new Key<>(LINK_ORDER); /** + * Linking options from dependencies. + */ + public static final Key<String> LINKOPT = new Key<>(LINK_ORDER); + + /** * Flags that apply to a transitive build dependency tree. Each item in the enum corresponds to a * flag. If the item is included in the key {@link #FLAG}, then the flag is considered set. */ |