1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
cmake_minimum_required(VERSION 2.8.4)
set (VERBOSE 1)
set (SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
execute_process(COMMAND R RHOME
OUTPUT_VARIABLE R_HOME)
file(GLOB sources ${SRC_DIR}/*.cpp)
set(NUM_TRUNC_CHARS 2)
set (RPATH "R")
set (RSCRIPT_PATH "Rscript")
if (CMAKE_HOST_WIN32)
execute_process(COMMAND ${RSCRIPT_PATH} -e "cat(.Platform$r_arch)"
OUTPUT_VARIABLE R_ARCH)
execute_process(COMMAND ${RPATH} --arch ${R_ARCH} RHOME
OUTPUT_VARIABLE R_HOME)
string(REPLACE "\\" "/" R_HOME ${R_HOME})
set (RPATH ${R_HOME}/bin/R)
endif()
set (RCPPFLAGS_CMD " ${RPATH} " " CMD " " config " " --cppflags ")
execute_process(COMMAND ${RPATH} CMD config --cppflags
OUTPUT_VARIABLE RCPPFLAGS)
if (CMAKE_HOST_WIN32)
if (${RCPPFLAGS} MATCHES "[-][I]([^ ;])+")
set (RCPPFLAGS ${CMAKE_MATCH_0})
endif()
endif()
string(SUBSTRING ${RCPPFLAGS} ${NUM_TRUNC_CHARS} -1 RCPPFLAGS)
include_directories(${RCPPFLAGS})
execute_process(COMMAND R CMD config --ldflags
OUTPUT_VARIABLE RLDFLAGS)
string(LENGTH ${RLDFLAGS} RLDFLAGS_LEN)
if (${RLDFLAGS} MATCHES "[-][L]([^ ;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RLDFLAGS_L)
string(STRIP ${RLDFLAGS_L} RLDFLAGS_L )
link_directories(${RLDFLAGS_L} )
endif()
if (${RLDFLAGS} MATCHES "[-][l]([^;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RLDFLAGS_l)
string(STRIP ${RLDFLAGS_l} RLDFLAGS_l )
endif()
execute_process(COMMAND Rscript -e "Rcpp:::CxxFlags()"
OUTPUT_VARIABLE RCPPINCL)
string(SUBSTRING ${RCPPINCL} ${NUM_TRUNC_CHARS} -1 RCPPINCL)
include_directories(${RCPPINCL})
execute_process(COMMAND Rscript -e "Rcpp:::LdFlags()"
OUTPUT_VARIABLE RCPPLIBS)
execute_process(COMMAND Rscript -e "RInside:::CxxFlags()"
OUTPUT_VARIABLE RINSIDEINCL)
string(SUBSTRING ${RINSIDEINCL} ${NUM_TRUNC_CHARS} -1 RINSIDEINCL)
include_directories(${RINSIDEINCL})
execute_process(COMMAND Rscript -e "RInside:::LdFlags()"
OUTPUT_VARIABLE RINSIDELIBS)
execute_process(COMMAND Rscript -e "cat(paste('-I', system.file('include', package = 'RcppEigen'), sep=''))" OUTPUT_VARIABLE RCPPEIGENINCL)
string(SUBSTRING ${RCPPEIGENINCL} ${NUM_TRUNC_CHARS} -1 RCPPEIGENINCL)
include_directories(${RCPPEIGENINCL})
if (CMAKE_HOST_WIN32)
string(LENGTH "libRcpp.a" lenRcppName)
string(LENGTH ${RCPPLIBS} lenRcppFQName)
math(EXPR RLibPathLen ${lenRcppFQName}-${lenRcppName}-1)
string(SUBSTRING ${RCPPLIBS} 0 ${RLibPathLen} RCPPLIBS_L)
link_directories(${RCPPLIBS_L})
math(EXPR RLibPathLen ${RLibPathLen}+1)
string(SUBSTRING ${RCPPLIBS} ${RLibPathLen} -1 RCPPLIBS_l)
#Remove the quotes
string(SUBSTRING ${RINSIDELIBS} 1 -1 RINSIDELIBS)
string(LENGTH ${RINSIDELIBS} lenRInsideFQNameLen)
math(EXPR lenRInsideFQNameLen ${lenRInsideFQNameLen}-1)
string(SUBSTRING ${RINSIDELIBS} 0 ${lenRInsideFQNameLen} RINSIDELIBS)
string(LENGTH "libRInside.a" lenRInsideName)
string(LENGTH ${RINSIDELIBS} lenRInsideFQName)
math(EXPR RLibPathLen ${lenRInsideFQName}-${lenRInsideName}-1)
string(SUBSTRING ${RINSIDELIBS} 0 ${RLibPathLen} RINSIDELIBS_L)
math(EXPR RLibPathLen ${RLibPathLen}+1)
string(SUBSTRING ${RINSIDELIBS} ${RLibPathLen} -1 RINSIDELIBS_l)
link_directories(${RINSIDELIBS_L})
set ( BLAS_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/libblas.lib)
set ( LAPACK_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/liblapack.lib)
link_directories(${CMAKE_CURRENT_SOURCE_DIR})
else()
if (${RCPPLIBS} MATCHES "[-][L]([^ ;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RCPPLIBS_L)
link_directories(${RCPPLIBS_L} )
endif()
if (${RCPPLIBS} MATCHES "[-][l][R]([^;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RCPPLIBS_l)
endif()
if (${RINSIDELIBS} MATCHES "[-][L]([^ ;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RINSIDELIBS_L)
link_directories(${RINSIDELIBS_L})
endif()
if (${RINSIDELIBS} MATCHES "[-][l][R]([^;])+")
string(SUBSTRING ${CMAKE_MATCH_0} ${NUM_TRUNC_CHARS} -1 RINSIDELIBS_l)
endif()
# If the faster 'gold' linker is used, to avoid complaints about undefined symbol
SET(CMAKE_FIND_LIBRARY_SUFFIXES_SAVED ${CMAKE_FIND_LIBRARY_SUFFIXES}) # Backup
LIST(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".so.3")
FIND_LIBRARY(BLAS_LIBRARY blas)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAVED}) # Restore
LIST(APPEND EXTRA_LIBRARIES ${BLAS_LIBRARY})
endif()
execute_process(COMMAND R CMD config CXXFLAGS
OUTPUT_VARIABLE RCXXFLAGS)
execute_process(COMMAND R CMD config BLAS_LIBS
OUTPUT_VARIABLE RBLAS)
execute_process(COMMAND R CMD config LAPACK_LIBS
OUTPUT_VARIABLE RLAPACK)
FIND_LIBRARY(LAPACK_LIBRARY lapack)
set(CMAKE_CXX_FLAGS "-W -Wall -pedantic -Wextra ${CMAKE_CXX_FLAGS}")
if (CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR
CMAKE_BUILD_TYPE STREQUAL "RelWithDebugInfo" )
add_definitions("-DDEBUG")
elseif ( CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
add_definitions("-O3")
endif()
foreach (next_SOURCE ${sources})
get_filename_component(source_name ${next_SOURCE} NAME_WE)
add_executable( ${source_name} ${next_SOURCE} )
target_link_libraries(${source_name} ${RLDFLAGS_l})
target_link_libraries(${source_name} ${BLAS_LIBS})
target_link_libraries(${source_name} ${LAPACK_LIBS})
target_link_libraries(${source_name} ${RINSIDELIBS_l})
target_link_libraries(${source_name} ${RCPPLIBS_l})
target_link_libraries(${source_name} ${EXTRA_LIBRARIES})
target_link_libraries(${source_name} ${LAPACK_LIBRARY})
endforeach (next_SOURCE ${sources})
|