[CMake] Setting compile defs with: Cuda, add_subdirectory, and set_target_properties (COMPILE_DEFINITIONS)
Brian Davis
bitminer at gmail.com
Thu Jul 15 11:25:03 EDT 2010
For anyone interested in a test case here it is. Put all files into same
directory. Or see attached zip file.
--snip add_gpu_matlab_mex_library.cmake --
macro( add_gpu_matlab_mex_library LIB_NAME )
#function( add_gpu_matlab_mex_library LIB_NAME )
PARSE_CMAKE_ARGUMENTS(ARG
"SRCDIRS;CPP_SOURCES;CU_SOURCES;LINK_LIBS;DEFINES" ""
${ARGN}
)
message( "ARG_SRCDIRS = ${ARG_SRCDIRS}" )
message( "ARG_CPP_SOURCES = ${ARG_CPP_SOURCES}" )
message( "ARG_CU_SOURCES = ${ARG_CU_SOURCES}" )
message( "ARG_LINK_LIBS= ${ARG_LINK_LIBS}")
cmake_minimum_required(VERSION 2.8)
# SET( MATLAB_CUDA_MEX_NAME ${LIB_NAME} )
SET( MATLAB_CUDA_FILES ${ARG_CU_SOURCES} ${ARG_CPP_SOURCES} )
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS 1)
INCLUDE_DIRECTORIES(
./
)
LINK_DIRECTORIES(
${MATLAB_LIBRARIES}
${MATLAB_MEX_LIBRARY}
${MATLAB_MX_LIBRARY}
${MATLAB_ENG_LIBRARY}
"${TOP}/build/dvip4-Win64/lib/Debug"
)
SET( MATLAB_LINK_LIBS
# libmx
# libmex
# libmat
)
SET( ${CUDA_LIBRARIES}
# cudart
# cuda
# cublas
# cublasemu
)
foreach( DEFINE_STR ${ARG_DEFINES} )
message( "DEFINE_STR = ${DEFINE_STR}" )
add_definitions( -D${DEFINE_STR} )
endforeach()
if(DEFINED ARG_CU_SOURCES )
message( "ARG_CU_SOURCES is defined as = ${ARG_CU_SOURCES}" )
CUDA_ADD_LIBRARY( ${LIB_NAME} SHARED ${MATLAB_CUDA_FILES} )
else()
message( "ARG_CU_SOURCES is not defined" )
ADD_LIBRARY( ${LIB_NAME} SHARED ${MATLAB_CUDA_FILES} )
endif()
TARGET_LINK_LIBRARIES( ${LIB_NAME}
${MATLAB_LINK_LIBS}
${CUDA_LIBRARIES}
${ARG_LINK_LIBS}
)
if( DEFINED ARG_DEFINES )
SET_TARGET_PROPERTIES( ${LIB_NAME} PROPERTIES
PREFIX ""
# COMPILE_DEFINITIONS ${ARG_DEFINES} )
# COMPILE_DEFINITIONS MY_DEFINE=DEFINE_THIS_GOOP
COMPILE_FLAGS -DMY_DEFINE=DEFINE_THIS_GOOP
)
endif()
SET_TARGET_PROPERTIES( ${LIB_NAME} PROPERTIES
SUFFIX .mexw64
LINKER_LANGUAGE CXX
LINK_FLAGS /export:mexFunction
COMPILE_FLAGS -DMY_DEFINE=DEFINE_THIS_GOOP
COMPILE_FLAGS_DEBUG -DMY_DEFINE=DEFINE_THIS_GOOP
COMPILE_DEFINITIONS MY_DEFINE=DEFINE_THIS_GOOP
)
INSTALL( TARGETS ${LIB_NAME} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR} )
INSTALL( TARGETS ${SQUARE_ME_TEST_APP}
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
)
endmacro()
#endfunction()
--end snip-
--snip CMakeLists.txt --
include( parse_cmake_arguments.cmake )
include( add_gpu_matlab_mex_library.cmake )
cmake_minimum_required(VERSION 2.8)
find_package( cuda )
SET( CUDA_VERBOSE_BUILD YES CACHE BOOL "" FORCE )
add_gpu_matlab_mex_library(
gpuPMatrixRecon
CPP_SOURCES
test1.cpp
test2.cpp
CU_SOURCES test1.cu
DEFINES CUDADeviceProperties_DLLExport=yes GPU_RECON=yes
)
# This does not work here either
#SET_TARGET_PROPERTIES( gpuPMatrixRecon PROPERTIES
# COMPILE_DEFINITIONS GPU_RECON=yes
# )
add_gpu_matlab_mex_library(
cpuPMatrixRecon
CPP_SOURCES
test1.cpp
test2.cpp
CU_SOURCES test1.cu
DEFINES CUDADeviceProperties_DLLExport=yes CPU_RECON=yes
)
#SET_TARGET_PROPERTIES( cpuPMatrixRecon PROPERTIES
# COMPILE_DEFINITIONS CPU_RECON=yes
# )
-- end snip --
--snip parse_cmake_arguments.cmake--
# code from http://www.cmake.org/Wiki/CMakeMacroParseArguments
MACRO(PARSE_CMAKE_ARGUMENTS prefix arg_names option_names)
SET(DEFAULT_ARGS)
FOREACH(arg_name ${arg_names})
SET(${prefix}_${arg_name})
ENDFOREACH(arg_name)
FOREACH(option ${option_names})
SET(${prefix}_${option} FALSE)
ENDFOREACH(option)
SET(current_arg_name DEFAULT_ARGS)
SET(current_arg_list)
FOREACH(arg ${ARGN})
SET(larg_names ${arg_names})
LIST(FIND larg_names "${arg}" is_arg_name)
IF (is_arg_name GREATER -1)
SET(${prefix}_${current_arg_name} ${current_arg_list})
SET(current_arg_name ${arg})
SET(current_arg_list)
ELSE (is_arg_name GREATER -1)
SET(loption_names ${option_names})
LIST(FIND loption_names "${arg}" is_option)
IF (is_option GREATER -1)
SET(${prefix}_${arg} TRUE)
ELSE (is_option GREATER -1)
SET(current_arg_list ${current_arg_list} ${arg})
ENDIF (is_option GREATER -1)
ENDIF (is_arg_name GREATER -1)
ENDFOREACH(arg)
SET(${prefix}_${current_arg_name} ${current_arg_list})
ENDMACRO(PARSE_CMAKE_ARGUMENTS)
--end snip--
--snip test1.cpp--
/* Gateway function */
void mexFunction( void /*int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]*/)
{
}
--end snip--
--snip test1.cu --
__global__ void my_kernel( float * data )
{
}
--end snip--
-snip test2.cpp --
void foo( void )
{
}
--end snip-
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100715/7fd904e5/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CudaLibsInSameDir.zip
Type: application/zip
Size: 2640 bytes
Desc: not available
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100715/7fd904e5/attachment.zip>
More information about the CMake
mailing list