aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-10-01 21:55:49 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-10-02 09:32:25 +0000
commitac0f10a9dcd3d482dd060b58c6a41f3767aa0b56 (patch)
treeb38775bc59d5efa560911d3b30470fb23ad4f00e /src
parent7b4b765a790da9ac9c18ed697ed433b1e2fcf548 (diff)
Propagates cc_library linkopts attribute to dependent objc_libraries.
-- MOS_MIGRATED_REVID=104439072
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java5
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.
*/