From 3f5bfb425af391c1740ff7794f0283be3d0f7589 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Fri, 26 Oct 2018 17:12:14 -0400 Subject: 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 --- Source/cmLinkLineDeviceComputer.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/cmLinkLineDeviceComputer.cxx b/Source/cmLinkLineDeviceComputer.cxx index 470f394..20bd537 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; } -- cgit v0.12