summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Maynard <robert.maynard@kitware.com>2018-10-26 17:12:14 -0400
committerBrad King <brad.king@kitware.com>2018-10-29 11:59:54 -0400
commit3f5bfb425af391c1740ff7794f0283be3d0f7589 (patch)
treebec0aab555175cc54db819af81c26097f9742840
parente768d96c74579c79e184027775e51b08cd77fe45 (diff)
downloadcmake-3f5bfb425af391c1740ff7794f0283be3d0f7589.tar.gz
CUDA: Filter out non-static libraries during device linking
Since commit v3.12.0-rc1~278^2 (CUDA: Pass more link libraries to device linking, 2018-03-27) we consider every link library during device linking and use `-Xnvlink` to pass those that do not end in `.a`. However, nvlink breaks on versioned shared library names such as `.so.1`. Work around this problem by not passing library paths that do not end in `.a` or `.lib`. nvlink would not find device symbols in them anyway. Fixes: #18504
-rw-r--r--Source/cmLinkLineDeviceComputer.cxx16
1 files changed, 8 insertions, 8 deletions
diff --git a/Source/cmLinkLineDeviceComputer.cxx b/Source/cmLinkLineDeviceComputer.cxx
index 470f3945a1..20bd5378c6 100644
--- a/Source/cmLinkLineDeviceComputer.cxx
+++ b/Source/cmLinkLineDeviceComputer.cxx
@@ -68,15 +68,15 @@ std::string cmLinkLineDeviceComputer::ComputeLinkLibraries(
}
if (item.IsPath) {
- // nvcc understands absolute paths to libraries ending in '.a' should
- // be passed to nvlink. Other extensions like '.so' or '.dylib' are
- // rejected by the nvcc front-end even though nvlink knows to ignore
- // them. Bypass the front-end via '-Xnvlink'.
- if (!cmHasLiteralSuffix(item.Value, ".a")) {
- fout << "-Xnvlink ";
+ // nvcc understands absolute paths to libraries ending in '.a' or '.lib'.
+ // These should be passed to nvlink. Other extensions need to be left
+ // out because nvlink may not understand or need them. Even though it
+ // can tolerate '.so' or '.dylib' it cannot tolerate '.so.1'.
+ if (cmHasLiteralSuffix(item.Value, ".a") ||
+ cmHasLiteralSuffix(item.Value, ".lib")) {
+ fout << this->ConvertToOutputFormat(
+ this->ConvertToLinkReference(item.Value));
}
- fout << this->ConvertToOutputFormat(
- this->ConvertToLinkReference(item.Value));
} else if (cmLinkItemValidForDevice(item.Value)) {
fout << item.Value;
}