[CMake] "modern" CUDA handling and static libraries

Crni Gorac cgorac at gmail.com
Tue Dec 19 15:14:50 EST 2017


Hello,

My project is alike for what is described by following CMakeLists.txt
for Cuda/Complex test case from CMake source distribution:

#########################
cmake_minimum_required(VERSION 3.8)
project (CudaComplex CXX CUDA)

string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

add_library(CudaLib STATIC dynamic.cu file1.cu file2.cu file3.cu mixed.cu)
set_target_properties(CudaLib PROPERTIES CUDA_SEPARABLE_COMPILATION OFF)
set_target_properties(CudaLib PROPERTIES POSITION_INDEPENDENT_CODE OFF)

add_library(CppLib STATIC dynamic.cpp mixed.cpp)

add_executable(CudaComplex main.cpp)
target_link_libraries(CudaComplex PUBLIC CudaLib CppLib)
#########################

So basically I want to build all my .cu files into one static library,
and all my .cpp files (except for main.cpp) into another static
library. These two libraries are then linked into main.cpp above. This
works fine, and make output is:

#########################
Scanning dependencies of target CppLib
Scanning dependencies of target CudaLib
[  8%] Building CXX object CMakeFiles/CppLib.dir/mixed.cpp.o
[ 25%] Building CUDA object CMakeFiles/CudaLib.dir/file1.cu.o
[ 25%] Building CUDA object CMakeFiles/CudaLib.dir/file2.cu.o
[ 33%] Building CXX object CMakeFiles/CppLib.dir/dynamic.cpp.o
[ 41%] Building CUDA object CMakeFiles/CudaLib.dir/dynamic.cu.o
[ 50%] Building CUDA object CMakeFiles/CudaLib.dir/file3.cu.o
[ 58%] Building CUDA object CMakeFiles/CudaLib.dir/mixed.cu.o
[ 66%] Linking CXX static library libCppLib.a
[ 66%] Built target CppLib
[ 75%] Linking CUDA static library libCudaLib.a
[ 75%] Built target CudaLib
Scanning dependencies of target CudaComplex
[ 83%] Building CXX object CMakeFiles/CudaComplex.dir/main.cpp.o
[ 91%] Linking CUDA device code CMakeFiles/CudaComplex.dir/cmake_device_link.o
[100%] Linking CXX executable CudaComplex
#########################

However, in my case these static libraries are actually to be
delivered to a client.  The problem is that the dynamic linking of
CUDA code (this is this line "Linking CUDA device code
CMakeFiles/CudaComplex.dir/cmake_device_link.o" in the make output
above) would still have to get done on client side, i.e. they would
have to install CUDA SDK and provide that this step is accomplished
through their build system.  So my question is: is it possible to
somehow generate static library with CUDA code, using this new
"...LANGUAGE CUDA..." CMake functionality, but that CUDA linking is
completed on my side (note that on client side no CUDA code will be
added to project)?

Thanks.


More information about the CMake mailing list