FindCUDAToolkit: Since 3.22 the CUDA::cudart has TYPE = UNKNOWN_LIBRARY
Since CMake 3.22, on a Windows platform, using find_package(CUDAToolkit) declares a CUDA::cudart target with a type equals to UNKNOWN_LIBRARY. Prior to 3.22 version, the type was an INTERFACE_LIBRARY on which I used to add the IMPORTED_LOCATION so I can copy the dll next to the executable
file(GLOB cudartDll "${CUDAToolkit_BIN_DIR}/cudart64*")
set_target_properties(CUDA::cudart PROPERTIES IMPORTED_LOCATION ${cudartDll})
When doing this on an UNKNOWN_LIBRARY, the linker tries to link the dll with the executable that obviously fail:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin\cudart64_110.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x320
ninja: build stopped: subcommand failed."
When listing properties with CMake 3.21.6, I get
CUDA::cudart IMPORTED = TRUE
CUDA::cudart IMPORTED_GLOBAL = TRUE
CUDA::cudart INTERFACE_INCLUDE_DIRECTORIES = C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include
CUDA::cudart INTERFACE_LINK_LIBRARIES = C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/lib/x64/cudart.lib
CUDA::cudart INTERFACE_SYSTEM_INCLUDE_DIRECTORIES = C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include
CUDA::cudart NAME = CUDA::cudart
CUDA::cudart TYPE = INTERFACE_LIBRARY
When listing properties with CMake 3.22.4 or 3.23.1, I get
CUDA::cudart HEADER_SETS =
CUDA::cudart IMPORTED = TRUE
CUDA::cudart IMPORTED_GLOBAL = TRUE
CUDA::cudart INTERFACE_HEADER_SETS =
CUDA::cudart INTERFACE_INCLUDE_DIRECTORIES = C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include
CUDA::cudart INTERFACE_SYSTEM_INCLUDE_DIRECTORIES = C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include
CUDA::cudart NAME = CUDA::cudart
CUDA::cudart TYPE = UNKNOWN_LIBRARY
Was this change done on purpose, or is it a regression ?
If it was on purpose, do I have a way to add the dll to CUDA::cudart that led to it’s listing using the new $<TARGET_RUNTIME_DLLS:exe> generator expression ?
Edited by Brad King