aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java45
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java14
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java3
5 files changed, 43 insertions, 26 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index af4c3e5acb..972f413364 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -368,7 +368,9 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
getBuildVariables(ruleContext),
getBuiltinIncludes(ruleContext),
coverageEnvironment.build(),
- ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST),
+ cppConfiguration.supportsInterfaceSharedObjects()
+ ? ruleContext.getPrerequisiteArtifact("$link_dynamic_library_tool", Mode.HOST)
+ : null,
getEnvironment(ruleContext),
builtInIncludeDirectories,
sysroot);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java
index d1a8835c6d..36dfc9eb93 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java
@@ -37,9 +37,10 @@ public class CppActionConfigs {
String gccToolPath,
String cppLinkDynamicLibraryToolPath,
String arToolPath,
- boolean supportsEmbeddedRuntimes) {
+ boolean supportsEmbeddedRuntimes,
+ boolean supportsInterfaceSharedLibraries) {
String cppDynamicLibraryLinkerTool = "";
- if (!features.contains("dynamic_library_linker_tool")) {
+ if (!features.contains("dynamic_library_linker_tool") && supportsInterfaceSharedLibraries) {
cppDynamicLibraryLinkerTool =
""
+ "feature {"
@@ -138,8 +139,10 @@ public class CppActionConfigs {
" tool {",
" tool_path: '" + gccToolPath + "'",
" }",
- " implies: 'build_interface_libraries'",
- " implies: 'dynamic_library_linker_tool'",
+ ifTrue(
+ supportsInterfaceSharedLibraries,
+ "implies: 'build_interface_libraries'",
+ "implies: 'dynamic_library_linker_tool'"),
" implies: 'symbol_counts'",
" implies: 'strip_debug_symbols'",
" implies: 'shared_flag'",
@@ -192,22 +195,24 @@ public class CppActionConfigs {
" implies: 'libraries_to_link'",
" implies: 'linker_param_file'",
"}",
- "feature {",
- " name: 'build_interface_libraries'",
- " flag_set {",
- " expand_if_all_available: 'generate_interface_library'",
- " action: 'c++-link-dynamic-library'",
- " flag_group {",
- " flag: '%{generate_interface_library}'",
- " flag: '%{interface_library_builder_path}'",
- " flag: '%{interface_library_input_path}'",
- " flag: '%{interface_library_output_path}'",
- " }",
- " }",
- "}",
- // Order of feature declaration matters, cppDynamicLibraryLinkerTool has to follow
- // right after build_interface_libraries.
- cppDynamicLibraryLinkerTool,
+ ifTrue(
+ supportsInterfaceSharedLibraries,
+ "feature {",
+ " name: 'build_interface_libraries'",
+ " flag_set {",
+ " expand_if_all_available: 'generate_interface_library'",
+ " action: 'c++-link-dynamic-library'",
+ " flag_group {",
+ " flag: '%{generate_interface_library}'",
+ " flag: '%{interface_library_builder_path}'",
+ " flag: '%{interface_library_input_path}'",
+ " flag: '%{interface_library_output_path}'",
+ " }",
+ " }",
+ "}",
+ // Order of feature declaration matters, cppDynamicLibraryLinkerTool has to
+ // follow right after build_interface_libraries.
+ cppDynamicLibraryLinkerTool),
"feature {",
" name: 'symbol_counts'",
" flag_set {",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index c836b1869a..b66c6904e4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -667,7 +667,8 @@ public class CppConfiguration extends BuildConfiguration.Fragment {
gccToolPath,
linkerToolPath,
arToolPath,
- supportsEmbeddedRuntimes),
+ supportsEmbeddedRuntimes,
+ toolchain.getSupportsInterfaceSharedObjects()),
toolchainBuilder);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index e7ae470655..8dc16d0329 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -758,8 +758,7 @@ public class CppLinkActionBuilder {
.setFeatureConfiguration(featureConfiguration);
// TODO(b/62693279): Cleanup once internal crosstools specify ifso building correctly.
- if (linkType.equals(LinkTargetType.DYNAMIC_LIBRARY)
- && !featureConfiguration.hasConfiguredLinkerPathInActionConfig()) {
+ if (shouldUseLinkDynamicLibraryTool()) {
linkCommandLineBuilder.forceToolPath(
toolchain.getLinkDynamicLibraryTool().getExecPathString());
}
@@ -783,8 +782,11 @@ public class CppLinkActionBuilder {
// Compute the set of inputs - we only need stable order here.
NestedSetBuilder<Artifact> dependencyInputsBuilder = NestedSetBuilder.stableOrder();
dependencyInputsBuilder.addTransitive(crosstoolInputs);
- dependencyInputsBuilder.add(toolchain.getLinkDynamicLibraryTool());
dependencyInputsBuilder.addTransitive(linkActionInputs.build());
+ // TODO(b/62693279): Cleanup once internal crosstools specify ifso building correctly.
+ if (shouldUseLinkDynamicLibraryTool()) {
+ dependencyInputsBuilder.add(toolchain.getLinkDynamicLibraryTool());
+ }
if (runtimeMiddleman != null) {
dependencyInputsBuilder.add(runtimeMiddleman);
}
@@ -895,6 +897,12 @@ public class CppLinkActionBuilder {
executionRequirements.build());
}
+ private boolean shouldUseLinkDynamicLibraryTool() {
+ return linkType.equals(LinkTargetType.DYNAMIC_LIBRARY)
+ && cppConfiguration.supportsInterfaceSharedObjects()
+ && !featureConfiguration.hasConfiguredLinkerPathInActionConfig();
+ }
+
/** The default heuristic on whether we need to use whole-archive for the link. */
private static boolean needWholeArchive(
LinkStaticness staticness,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index 2d2324259f..55fd396b87 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -87,7 +87,8 @@ public class CppLinkActionTest extends BuildViewTestCase {
"gcc_tool",
"dynamic_library_linker_tool",
"ar_tool",
- true))
+ true,
+ false))
.getFeatureConfiguration(
FeatureSpecification.create(
ImmutableSet.of(