Browse Source

Merge topic 'find_cudatoolkit_avoid_nvhpc_symlinks'

9d012b1f69 FindCUDAToolkit: Ensure that paths provided have no symlinks

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7974
Brad King 2 years ago
parent
commit
2a139018ce

+ 0 - 3
.gitlab/ci/ctest_exclusions.cmake

@@ -31,9 +31,6 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "nvhpc_")
   list(APPEND test_exclusions
     # FIXME(#24187): This test fails with NVHPC as the CUDA host compiler.
     "^CudaOnly.SeparateCompilationPTX$"
-
-    # FIXME(#24188): FindCUDAToolkit breaks on some symlink layouts.
-    "^Cuda.Toolkit$"
     )
 endif()
 

+ 28 - 7
Modules/FindCUDAToolkit.cmake

@@ -894,8 +894,25 @@ mark_as_advanced(CUDA_CUDART
 if(CUDAToolkit_FOUND)
   set(CUDAToolkit_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIR})
   get_filename_component(CUDAToolkit_LIBRARY_DIR ${CUDA_CUDART} DIRECTORY ABSOLUTE)
+
+  # Build search paths without any symlinks
+  file(REAL_PATH "${CUDAToolkit_LIBRARY_DIR}" _cmake_search_dir)
+  set(CUDAToolkit_LIBRARY_SEARCH_DIRS "${_cmake_search_dir}")
+
+  # Detect we are in a splayed nvhpc toolkit layout and add extra
+  # search paths without symlinks
+  if(CUDAToolkit_LIBRARY_DIR  MATCHES ".*/cuda/${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}/lib64$")
+    # Search location for math_libs/
+    file(REAL_PATH "${CUDAToolkit_LIBRARY_DIR}/../../../" _cmake_search_dir)
+    list(APPEND CUDAToolkit_LIBRARY_SEARCH_DIRS "${_cmake_search_dir}")
+
+    # Search location for extras like cupti
+    file(REAL_PATH "${CUDAToolkit_LIBRARY_DIR}/../" _cmake_search_dir)
+    list(APPEND CUDAToolkit_LIBRARY_SEARCH_DIRS "${_cmake_search_dir}")
+  endif()
 endif()
 
+
 #-----------------------------------------------------------------------------
 # Construct import targets
 if(CUDAToolkit_FOUND)
@@ -907,21 +924,21 @@ if(CUDAToolkit_FOUND)
 
     find_library(CUDA_${lib_name}_LIBRARY
       NAMES ${search_names}
-      HINTS ${CUDAToolkit_LIBRARY_DIR}
+      HINTS ${CUDAToolkit_LIBRARY_SEARCH_DIRS}
             ENV CUDA_PATH
       PATH_SUFFIXES nvidia/current lib64 lib/x64 lib
+                    # Support NVHPC splayed math library layout
+                    math_libs/${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}/lib64
+                    math_libs/lib64
                     ${arg_EXTRA_PATH_SUFFIXES}
     )
     # Don't try any stub directories until we have exhausted all other
     # search locations.
     find_library(CUDA_${lib_name}_LIBRARY
       NAMES ${search_names}
-      HINTS ${CUDAToolkit_LIBRARY_DIR}
+      HINTS ${CUDAToolkit_LIBRARY_SEARCH_DIRS}
             ENV CUDA_PATH
       PATH_SUFFIXES lib64/stubs lib/x64/stubs lib/stubs stubs
-                    # Support NVHPC splayed math library layout
-                    ../../math_libs/${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}/lib64
-                    ../../math_libs/lib64
     )
 
     mark_as_advanced(CUDA_${lib_name}_LIBRARY)
@@ -1054,11 +1071,15 @@ if(CUDAToolkit_FOUND)
 
   if(CUDAToolkit_CUPTI_INCLUDE_DIR)
     _CUDAToolkit_find_and_add_import_lib(cupti
-                                        EXTRA_PATH_SUFFIXES ../extras/CUPTI/lib64/
+                                        EXTRA_PATH_SUFFIXES extras/CUPTI/lib64/
+                                                            extras/CUPTI/lib/
+                                                            ../extras/CUPTI/lib64/
                                                             ../extras/CUPTI/lib/
                                         EXTRA_INCLUDE_DIRS "${CUDAToolkit_CUPTI_INCLUDE_DIR}")
     _CUDAToolkit_find_and_add_import_lib(cupti_static
-                                        EXTRA_PATH_SUFFIXES ../extras/CUPTI/lib64/
+                                        EXTRA_PATH_SUFFIXES extras/CUPTI/lib64/
+                                                            extras/CUPTI/lib/
+                                                            ../extras/CUPTI/lib64/
                                                             ../extras/CUPTI/lib/
                                         EXTRA_INCLUDE_DIRS "${CUDAToolkit_CUPTI_INCLUDE_DIR}")
   endif()

+ 5 - 0
Tests/Cuda/Toolkit/CMakeLists.txt

@@ -30,6 +30,8 @@ endif()
 foreach (cuda_lib IN LISTS cuda_libs)
   if(NOT CUDA_${cuda_lib}_LIBRARY)
     message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY not found")
+  elseif(CUDA_${cuda_lib}_LIBRARY MATCHES [[\.\./]])
+    message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY[\"${CUDA_${cuda_lib}_LIBRARY}\"] to not contain /..")
   endif()
   if(NOT TARGET CUDA::${cuda_lib})
     message(FATAL_ERROR "expected CUDAToolkit target CUDA::${cuda_lib} not found")
@@ -41,6 +43,9 @@ if(CUDAToolkit_VERSION_MAJOR VERSION_LESS 11)
   list(APPEND npp_libs nppicom)
 endif()
 foreach (cuda_lib IN LISTS npp_libs)
+  if(CUDA_${cuda_lib}_LIBRARY MATCHES [[\.\./]])
+    message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY[\"${CUDA_${cuda_lib}_LIBRARY}\"] to not contain /..")
+  endif()
   if(NOT TARGET CUDA::${cuda_lib})
     message(FATAL_ERROR "The CUDA::${cuda_lib} target was expected but couldn't be found")
   endif()

+ 6 - 0
Tests/CudaOnly/Toolkit/CMakeLists.txt

@@ -28,6 +28,8 @@ endif()
 foreach (cuda_lib IN LISTS cuda_libs)
   if(NOT CUDA_${cuda_lib}_LIBRARY)
     message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY not found")
+  elseif(CUDA_${cuda_lib}_LIBRARY MATCHES [[\.\./]])
+    message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY[\"${CUDA_${cuda_lib}_LIBRARY}\"] to not contain /..")
   endif()
   if(NOT TARGET CUDA::${cuda_lib})
     message(FATAL_ERROR "expected CUDAToolkit target CUDA::${cuda_lib} not found")
@@ -41,6 +43,8 @@ endif()
 foreach (cuda_lib )
   if(NOT CUDA_${cuda_lib}_LIBRARY)
     message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY not found")
+  elseif(CUDA_${cuda_lib}_LIBRARY MATCHES [[\.\./]])
+    message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY[\"${CUDA_${cuda_lib}_LIBRARY}\"] to not contain /..")
   endif()
   if(NOT TARGET CUDA::${cuda_lib})
     message(FATAL_ERROR "expected CUDAToolkit target CUDA::${cuda_lib} not found")
@@ -50,6 +54,8 @@ endforeach()
 foreach (cuda_lib nvrtc nvToolsExt OpenCL)
   if(NOT CUDA_${cuda_lib}_LIBRARY)
     message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY not found")
+  elseif(CUDA_${cuda_lib}_LIBRARY MATCHES [[\.\./]])
+    message(FATAL_ERROR "expected CUDAToolkit variable CUDA_${cuda_lib}_LIBRARY[\"${CUDA_${cuda_lib}_LIBRARY}\"] to not contain /..")
   endif()
 
   if(NOT TARGET CUDA::${cuda_lib})