mirror of
https://github.com/Kitware/CMake.git
synced 2026-11-06 05:16:58 +00:00
CUDA: Add per-language module -DEF: flag on Windows
NVIDIA CUDA links with `link.exe` directly, but had no
`CMAKE_CUDA_LINK_DEF_FILE_FLAG` and fell back to the global
`CMAKE_LINK_DEF_FILE_FLAG`. With IntelLLVM enabled in the same build
tree, that holds `/Qoption,link,/DEF:`, which `link.exe` ignores, so a
CUDA DLL exported nothing from its `.def` file. Commit 8b710d8264
(Linker: Generate per-language module -DEF: flags on Windows,
2025-05-28) covered the other Windows toolchains but missed CUDA.
Fixes: #25598
Issue: #26005
This commit is contained in:
1 parent
89e5c19c55
commit
6401308473
6 files changed
+28
No files matched your search
@@ -26,6 +26,7 @@ set(CMAKE_CUDA_SHARED_LIBRARY_COMPILE_DEFINITIONS "_WINDLL")
|
||||
set(CMAKE_CUDA_CREATE_SHARED_MODULE ${CMAKE_CUDA_CREATE_SHARED_LIBRARY})
|
||||
set(CMAKE_CUDA_CREATE_STATIC_LIBRARY "<CMAKE_AR> ${CMAKE_CL_NOLOGO}${_PLATFORM_ARCHIVE_FLAGS} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
|
||||
set(CMAKE_CUDA_LINKER_SUPPORTS_PDB ON)
|
||||
set(CMAKE_CUDA_LINK_DEF_FILE_FLAG "/DEF:")
|
||||
set(CMAKE_CUDA_LIBRARY_PATH_FLAG "-LIBPATH:")
|
||||
set(CMAKE_CUDA_LINK_EXECUTABLE
|
||||
"${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${__IMPLICIT_LINKS} ${CMAKE_END_TEMP_FILE}")
|
||||
|
||||
@@ -12,6 +12,7 @@ add_cuda_test_macro(CudaOnly.CompileFlags CudaOnlyCompileFlags)
|
||||
add_cuda_test_macro(CudaOnly.EnableStandard CudaOnlyEnableStandard)
|
||||
add_cuda_test_macro(CudaOnly.ExportPTX CudaOnlyExportPTX)
|
||||
add_cuda_test_macro(CudaOnly.LinkDirectory CudaOnlyLinkDirectory)
|
||||
add_cuda_test_macro(CudaOnly.ModuleDefinition CudaOnlyModuleDefinition)
|
||||
add_cuda_test_macro(CudaOnly.SharedRuntimePlusToolkit CudaOnlySharedRuntimePlusToolkit)
|
||||
add_cuda_test_macro(CudaOnly.StaticRuntimePlusToolkit CudaOnlyStaticRuntimePlusToolkit)
|
||||
if(NOT WIN32 AND CMake_TEST_CUDA STREQUAL "NVIDIA")
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
project(ModuleDefinition CUDA)
|
||||
|
||||
if(MSVC)
|
||||
# Simulate another language overriding the -DEF: flag.
|
||||
# The generators prefer CMAKE_<LANG>_LINK_DEF_FILE_FLAG.
|
||||
set(CMAKE_LINK_DEF_FILE_FLAG "bad-def-flag:")
|
||||
endif()
|
||||
|
||||
# Symbols are exported only through the .def file.
|
||||
add_library(CudaOnlyModuleDefinitionLib SHARED lib.cu lib.def)
|
||||
|
||||
add_executable(CudaOnlyModuleDefinition main.cu)
|
||||
target_link_libraries(CudaOnlyModuleDefinition PRIVATE CudaOnlyModuleDefinitionLib)
|
||||
@@ -0,0 +1,4 @@
|
||||
extern "C" int moddef_answer()
|
||||
{
|
||||
return 42;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
EXPORTS
|
||||
moddef_answer
|
||||
@@ -0,0 +1,6 @@
|
||||
extern "C" int moddef_answer();
|
||||
|
||||
int main()
|
||||
{
|
||||
return moddef_answer() == 42 ? 0 : 1;
|
||||
}
|
||||
Reference in new issue
Block a user