Propagates cc_library linkopts attribute to dependent objc_libraries.
--
MOS_MIGRATED_REVID=104439072
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 e0d9700..6ba0442 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 @@
.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 @@
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 cd65adb..8055a70 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_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.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 @@
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 06c4a51..85e05dc 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 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.
*/