[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