Skip to content

Commit 30c135a

Browse files
committed
build: Switch from FindCUDA to FindCUDAToolkit (#2072)
FindCUDA is obsolete. FindCUDAToolkit was added in CMake 3.17. Current cmake_minimum_required is already 3.19. Signed-off-by: Mark Leone <mleone@nvidia.com>
1 parent 354ece3 commit 30c135a

2 files changed

Lines changed: 67 additions & 8 deletions

File tree

src/cmake/externalpackages.cmake

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,42 @@ if (OSL_USE_OPTIX)
118118
message (STATUS "CUDA_TOOLKIT_ROOT_DIR = ${CUDA_TOOLKIT_ROOT_DIR}")
119119
endif ()
120120

121-
checked_find_package (CUDA REQUIRED
121+
if (CUDA_TOOLKIT_ROOT_DIR)
122+
set (CUDAToolkit_ROOT "${CUDA_TOOLKIT_ROOT_DIR}")
123+
endif ()
124+
125+
checked_find_package (CUDAToolkit REQUIRED
122126
VERSION_MIN 9.0
123127
RECOMMEND_MIN 11.0
124128
RECOMMEND_MIN_REASON
125129
"We don't actively test CUDA older than 11"
126-
PRINT CUDA_INCLUDES)
127-
set (CUDA_INCLUDES ${CUDA_TOOLKIT_ROOT_DIR}/include)
128-
include_directories (BEFORE "${CUDA_INCLUDES}")
130+
PRINT CUDAToolkit_INCLUDE_DIRS CUDAToolkit_NVCC_EXECUTABLE)
131+
132+
# Compatibility bridge: legacy CUDA variables.
133+
set (CUDA_FOUND ${CUDAToolkit_FOUND})
134+
set (CUDA_VERSION ${CUDAToolkit_VERSION})
135+
set (CUDA_INCLUDES ${CUDAToolkit_INCLUDE_DIRS})
136+
if (CUDA_INCLUDES)
137+
list (GET CUDA_INCLUDES 0 CUDA_INCLUDES)
138+
endif ()
139+
140+
# Derive the root dir. See https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html
141+
if (CUDAToolkit_LIBRARY_ROOT)
142+
set (CUDA_TOOLKIT_ROOT_DIR "${CUDAToolkit_LIBRARY_ROOT}")
143+
elseif (CUDAToolkit_TARGET_DIR)
144+
set (CUDA_TOOLKIT_ROOT_DIR "${CUDAToolkit_TARGET_DIR}")
145+
elseif (CUDAToolkit_BIN_DIR)
146+
get_filename_component (CUDA_TOOLKIT_ROOT_DIR "${CUDAToolkit_BIN_DIR}" DIRECTORY)
147+
endif ()
148+
if (NOT CUDA_TOOLKIT_ROOT_DIR)
149+
message (FATAL_ERROR "Could not determine CUDA toolkit root directory.")
150+
endif ()
151+
152+
if (CUDAToolkit_NVCC_EXECUTABLE)
153+
set (CUDA_NVCC_EXECUTABLE "${CUDAToolkit_NVCC_EXECUTABLE}")
154+
else ()
155+
find_program (CUDA_NVCC_EXECUTABLE NAMES nvcc HINTS "${CUDA_TOOLKIT_ROOT_DIR}/bin")
156+
endif ()
129157

130158
STRING (FIND ${LLVM_TARGETS} "NVPTX" nvptx_index)
131159
if (NOT ${nvptx_index} GREATER -1)
@@ -138,7 +166,11 @@ if (OSL_USE_OPTIX)
138166
# suffixes earlier in the suffix list. Don't forget to restore after
139167
# so that this only applies to these library searches right here.
140168
set (save_lib_path ${CMAKE_FIND_LIBRARY_SUFFIXES})
141-
if (CUDA_PREFER_STATIC_LIBS)
169+
if (CUDA_PREFER_STATIC_LIBS AND TARGET CUDA::cudart_static)
170+
set (cudart_lib CUDA::cudart_static)
171+
elseif (TARGET CUDA::cudart)
172+
set (cudart_lib CUDA::cudart)
173+
elseif (CUDA_PREFER_STATIC_LIBS)
142174
set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
143175
find_library(cudart_lib REQUIRED
144176
NAMES cudart_static cudart
@@ -148,7 +180,6 @@ if (OSL_USE_OPTIX)
148180
NAMES cudart
149181
PATHS "${CUDA_TOOLKIT_ROOT_DIR}/lib64" "${CUDA_TOOLKIT_ROOT_DIR}/x64" "${CUDA_TOOLKIT_ROOT_DIR}/lib/x64")
150182
endif ()
151-
# Is it really a good idea to completely reset CUDA_LIBRARIES here?
152183
set(CUDA_LIBRARIES ${cudart_lib})
153184
set(CUDA_EXTRA_LIBS ${CUDA_EXTRA_LIBS} dl rt)
154185
set (CMAKE_FIND_LIBRARY_SUFFIXES ${save_lib_path})

testsuite/example-cuda/CMakeLists.txt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: BSD-3-Clause
33
# https://github.com/AcademySoftwareFoundation/OpenShadingLanguage
44

5-
cmake_minimum_required(VERSION 3.15)
5+
cmake_minimum_required(VERSION 3.19) # Same as top-level CMakeLists.txt
66
project(examplecuda LANGUAGES CXX)
77

88
if (NOT CMAKE_BUILD_TYPE)
@@ -19,12 +19,16 @@ include(check_is_enabled)
1919
include(checked_find_package)
2020

2121
find_package(OSL REQUIRED)
22-
find_package(CUDA REQUIRED)
22+
find_package(CUDAToolkit REQUIRED)
2323
checked_find_package(LLVM 7.0 REQUIRED)
2424
checked_find_package(Imath 3.1 REQUIRED)
2525
checked_find_package(OpenImageIO 2.4 REQUIRED)
2626
checked_find_package(OptiX REQUIRED)
2727

28+
set(CUDA_TOOLKIT_ROOT_DIR ${CUDAToolkit_ROOT_DIR})
29+
set(CUDA_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS})
30+
set(CUDA_NVCC_EXECUTABLE ${CUDAToolkit_NVCC_EXECUTABLE})
31+
set(CUDA_LIBRARIES CUDA::cudart)
2832

2933
# Make the build area layout look like we expect
3034
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
@@ -34,13 +38,37 @@ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
3438
# TODO: what are the path suffixes on other platforms?
3539
find_library(CUDA_nvrtc_LIBRARY nvrtc HINTS ${CUDA_TOOLKIT_ROOT_DIR} PATH_SUFFIXES lib lib64)
3640
find_library(CUDA_cuda_LIBRARY cuda HINTS ${CUDA_TOOLKIT_ROOT_DIR} PATH_SUFFIXES lib/stubs lib64/stubs)
41+
if (TARGET CUDA::nvrtc)
42+
set(CUDA_nvrtc_LIBRARY CUDA::nvrtc)
43+
endif ()
44+
if (TARGET CUDA::cuda_driver)
45+
set(CUDA_cuda_LIBRARY CUDA::cuda_driver)
46+
endif ()
3747

3848
# TODO: move to sm_60?
3949
set(CUDA_TARGET_ARCH sm_35)
4050

4151
set (CMAKE_CXX_STANDARD 17 CACHE STRING
4252
"C++ standard to build with (17, 20, etc.)")
4353

54+
# Compile a CUDA source file to PTX with NVCC. (Formerly provided by FindCUDA.cmake)
55+
function(cuda_compile_ptx out_var cuda_src)
56+
cmake_parse_arguments(_ccp "" "" "OPTIONS" ${ARGN})
57+
get_filename_component(cuda_src_we ${cuda_src} NAME_WE)
58+
set(cuda_ptx "${CMAKE_CURRENT_BINARY_DIR}/${cuda_src_we}.ptx")
59+
add_custom_command(OUTPUT ${cuda_ptx}
60+
COMMAND ${CUDA_NVCC_EXECUTABLE}
61+
${_ccp_OPTIONS}
62+
-ptx
63+
${cuda_src}
64+
-o ${cuda_ptx}
65+
MAIN_DEPENDENCY ${cuda_src}
66+
DEPENDS ${cuda_src}
67+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
68+
)
69+
set(${out_var} ${cuda_ptx} PARENT_SCOPE)
70+
endfunction()
71+
4472
# Compile our "renderer" to PTX
4573
cuda_compile_ptx(CUDA_PTX_FILES cuda_grid_renderer.cu
4674
OPTIONS --gpu-architecture=${CUDA_TARGET_ARCH} --use_fast_math -dc

0 commit comments

Comments
 (0)