aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL5
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java27
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java19
5 files changed, 57 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
index 52bbd59450..03a9f9d674 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java
@@ -320,7 +320,11 @@ public final class CppToolchainInfo {
this.supportsFission = supportsFission;
this.supportsStartEndLib = supportsStartEndLib;
this.supportsEmbeddedRuntimes = supportsEmbeddedRuntimes;
- this.supportsDynamicLinker = supportsDynamicLinker;
+ this.supportsDynamicLinker =
+ supportsDynamicLinker
+ || toolchainFeatures
+ .getActivatableNames()
+ .contains(CppRuleClasses.DYNAMIC_LINKING_MODE);
this.supportsInterfaceSharedObjects = supportsInterfaceSharedObjects;
this.supportsGoldLinker = supportsGoldLinker;
this.toolchainNeedsPic = toolchainNeedsPic;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
index d6593722cb..eca8122d38 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/MOCK_CROSSTOOL
@@ -310,8 +310,7 @@ toolchain {
}
toolchain {
- toolchain_identifier: "local_darwin-no-dyn-linker"
-
+ toolchain_identifier: "darwin-no-dyn-linker"
host_system_name: "local"
target_system_name: "local"
target_cpu: "darwin"
@@ -572,6 +571,7 @@ toolchain {
}
toolchain {
+ toolchain_identifier: "windows_msys64-no-dyn-linker"
abi_version: "local"
abi_libc_version: "local"
builtin_sysroot: ""
@@ -581,7 +581,6 @@ toolchain {
target_libc: "local"
target_cpu: "x64_windows"
target_system_name: "local"
- toolchain_identifier: "local_windows_msys64-no-dyn-linker"
tool_path { name: "ar" path: "C:/tools/msys64/usr/bin/ar" }
tool_path { name: "compat-ld" path: "C:/tools/msys64/usr/bin/ld" }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index 5010faf11d..f9b07d209d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -85,11 +85,14 @@ public final class BazelMockCcSupport extends MockCcSupport {
" toolchains = {",
" 'local|compiler': ':cc-compiler-local',",
" 'k8|compiler': ':cc-compiler-k8',",
+ " 'k8|compiler_no_dyn_linker': ':cc-no-dyn-linker-k8',",
" 'piii|compiler': ':cc-compiler-piii',",
" 'darwin|compiler': ':cc-compiler-darwin',",
+ " 'darwin|compiler_no_dyn_linker': ':cc-no-dyn-linker-darwin',",
" 'ios_x86_64|compiler': ':cc-compiler-ios_x86_64',",
" 'armeabi-v7a|compiler': ':cc-compiler-armeabi-v7a',",
" 'x64_windows|windows_msys64': ':cc-compiler-x64_windows',",
+ " 'x64_windows|compiler_no_dyn_linker': ':cc-no-dyn-linker-x64_windows',",
" 'ppc|compiler': ':cc-compiler-ppc',",
" })",
"cc_toolchain(name = 'cc-compiler-k8', all_files = ':empty', compiler_files = ':empty',",
@@ -99,6 +102,13 @@ public final class BazelMockCcSupport extends MockCcSupport {
" module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
" objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
")",
+ "cc_toolchain(name = 'cc-no-dyn-linker-k8', all_files = ':empty', ",
+ " compiler_files = ':empty', cpu = 'k8', compiler = 'compiler_no_dyn_linker', ",
+ " libc = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+ " ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
+ " module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
+ " objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
+ ")",
"cc_toolchain(name = 'cc-compiler-ppc', all_files = ':empty', compiler_files = ':empty',",
" cpu = 'ppc', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
" dynamic_runtime_libs = [':empty'], ",
@@ -122,6 +132,14 @@ public final class BazelMockCcSupport extends MockCcSupport {
" module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
" objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
")",
+ "cc_toolchain(name = 'cc-no-dyn-linker-darwin', all_files = ':empty', ",
+ " compiler_files = ':empty',",
+ " cpu = 'darwin', compiler = 'compiler_no_dyn_linker', libc = 'macosx', " ,
+ " dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+ " ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
+ " module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
+ " objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
+ ")",
"cc_toolchain(name = 'cc-compiler-ios_x86_64', all_files = ':empty', ",
" compiler_files = ':empty',",
" cpu = 'ios_x86_64', compiler = 'compiler', libc = 'local', dwp_files = ':empty',",
@@ -148,6 +166,15 @@ public final class BazelMockCcSupport extends MockCcSupport {
" module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
" objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
")",
+ "cc_toolchain(name = 'cc-no-dyn-linker-x64_windows', all_files = ':empty', ",
+ " compiler_files = ':empty',",
+ " cpu = 'x64_windows', compiler = 'compiler_no_dyn_linker', libc = 'local', ",
+ " dwp_files = ':empty',",
+ " dynamic_runtime_libs = [':empty'], ",
+ " ar_files = ':empty', as_files = ':empty', linker_files = ':empty',",
+ " module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
+ " objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
+ ")",
"filegroup(",
" name = 'interface_library_builder',",
" srcs = ['build_interface_so'],",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index d55d3b53a6..81c86f9d9a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.rules.cpp.CppCompileAction;
+import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -128,6 +129,9 @@ public abstract class MockCcSupport {
/** This feature will prevent bazel from patching the crosstool. */
public static final String NO_LEGACY_FEATURES_FEATURE = "feature { name: 'no_legacy_features' }";
+ public static final String DYNAMIC_LINKING_MODE_FEATURE =
+ "feature { name: '" + CppRuleClasses.DYNAMIC_LINKING_MODE + "'}";
+
/** Feature expected by the C++ rules when pic build is requested */
public static final String PIC_FEATURE =
""
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
index c4afac299f..f2c7e9c3d4 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java
@@ -912,4 +912,23 @@ public class CcToolchainTest extends BuildViewTestCase {
(CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
assertThat(toolchainProvider.getAbi()).isEqualTo("banana");
}
+
+ @Test
+ public void testSupportsDynamicLinkerCheckFeatures() throws Exception {
+ writeDummyCcToolchain();
+
+ getAnalysisMock()
+ .ccSupport()
+ .setupCrosstool(mockToolsConfig, MockCcSupport.DYNAMIC_LINKING_MODE_FEATURE);
+
+ // To make sure the toolchain doesn't define linking_mode_flags { mode: DYNAMIC } as that would
+ // also result in supportsDynamicLinker returning true
+ useConfiguration("--compiler=compiler_no_dyn_linker");
+
+ ConfiguredTarget target = getConfiguredTarget("//a:b");
+ CcToolchainProvider toolchainProvider =
+ (CcToolchainProvider) target.get(ToolchainInfo.PROVIDER);
+
+ assertThat(toolchainProvider.supportsDynamicLinker()).isTrue();
+ }
}