build: Improve R library handling in CMake

This commit is contained in:
Max Lübke 2022-11-10 15:38:38 +01:00
parent 2457dfc337
commit d6cd0ac3a8
6 changed files with 92 additions and 76 deletions

View File

@ -1,25 +0,0 @@
# prepare R environment (Rcpp + RInside)
find_program(R_EXE "R")
# search for R executable, R header file and library path
if(R_EXE)
execute_process(COMMAND ${R_EXE} RHOME
OUTPUT_VARIABLE R_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
find_path(R_INCLUDE_DIR R.h
HINTS ${R_ROOT_DIR}
PATHS /usr/inlcude /usr/local/include /usr/share
PATH_SUFFIXES include/R R/include
)
find_library(R_LIBRARY R
HINTS ${R_ROOT_DIR}/lib
)
else()
message(FATAL_ERROR "No R runtime found!")
endif()
set(R_LIBRARIES ${R_LIBRARY})
set(R_INCLUDE_DIRS ${R_INCLUDE_DIR})

View File

@ -1,23 +0,0 @@
# find RInside libraries and include path
execute_process(COMMAND echo "cat(find.package('RInside'))"
COMMAND ${R_EXE} --vanilla --slave
RESULT_VARIABLE RINSIDE_NOT_FOUND
ERROR_QUIET
OUTPUT_VARIABLE RINSIDE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(RInside_NOT_FOUND)
message(FATAL_ERROR "RInside not found!")
endif()
find_library(R_RInside_LIBRARY libRInside.so
HINTS ${RINSIDE_PATH}/lib)
list(APPEND R_LIBRARIES ${R_RInside_LIBRARY})
find_path(R_RInside_INCLUDE_DIR RInside.h
HINTS ${RINSIDE_PATH}
PATH_SUFFIXES include)
list(APPEND R_INCLUDE_DIRS ${R_RInside_INCLUDE_DIR})

89
CMake/FindRRuntime.cmake Normal file
View File

@ -0,0 +1,89 @@
# prepare R environment (Rcpp + RInside)
find_program(R_EXE "R")
# search for R executable, R header file and library path
if(R_EXE)
execute_process(
COMMAND ${R_EXE} RHOME
OUTPUT_VARIABLE R_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
find_path(
R_INCLUDE_DIR R.h
HINTS ${R_ROOT_DIR}
PATHS /usr/inlcude /usr/local/include /usr/share
PATH_SUFFIXES include/R R/include
)
find_library(
R_LIBRARY R
HINTS ${R_ROOT_DIR}/lib
)
else()
message(FATAL_ERROR "No R runtime found!")
endif()
mark_as_advanced(R_INCLUDE_DIR R_LIBRARY R_EXE)
set(R_LIBRARIES ${R_LIBRARY})
set(R_INCLUDE_DIRS ${R_INCLUDE_DIR})
# find Rcpp include directory
execute_process(COMMAND echo "cat(find.package('Rcpp'))"
COMMAND ${R_EXE} --vanilla --slave
RESULT_VARIABLE RCPP_NOT_FOUND
ERROR_QUIET
OUTPUT_VARIABLE RCPP_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(RCPP_NOT_FOUND)
message(FATAL_ERROR "Rcpp not found!")
endif()
find_path(R_Rcpp_INCLUDE_DIR Rcpp.h
HINTS ${RCPP_PATH}
PATH_SUFFIXES include)
mark_as_advanced(R_Rcpp_INCLUDE_DIR)
list(APPEND R_INCLUDE_DIRS ${R_Rcpp_INCLUDE_DIR})
# find RInside libraries and include path
execute_process(COMMAND echo "cat(find.package('RInside'))"
COMMAND ${R_EXE} --vanilla --slave
RESULT_VARIABLE RINSIDE_NOT_FOUND
ERROR_QUIET
OUTPUT_VARIABLE RINSIDE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(RInside_NOT_FOUND)
message(FATAL_ERROR "RInside not found!")
endif()
find_library(R_RInside_LIBRARY libRInside.so
HINTS ${RINSIDE_PATH}/lib)
find_path(R_RInside_INCLUDE_DIR RInside.h
HINTS ${RINSIDE_PATH}
PATH_SUFFIXES include)
list(APPEND R_LIBRARIES ${R_RInside_LIBRARY})
list(APPEND R_INCLUDE_DIRS ${R_RInside_INCLUDE_DIR})
mark_as_advanced(R_RInside_LIBRARY R_RInside_INCLUDE_DIR)
# putting all together into interface library
add_library(RRuntime INTERFACE IMPORTED)
set_target_properties(
RRuntime PROPERTIES
INTERFACE_LINK_LIBRARIES "${R_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${R_INCLUDE_DIRS}"
)
unset(R_LIBRARIES)
unset(R_INCLUDE_DIRS)

View File

@ -1,23 +0,0 @@
# find Rcpp include directory
execute_process(COMMAND echo "cat(find.package('Rcpp'))"
COMMAND ${R_EXE} --vanilla --slave
RESULT_VARIABLE RCPP_NOT_FOUND
ERROR_QUIET
OUTPUT_VARIABLE RCPP_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(RCPP_NOT_FOUND)
message(FATAL_ERROR "Rcpp not found!")
endif()
# find_library(R_Rcpp_LIBRARY Rcpp.so
# HINTS ${RCPP_PATH}/libs)
# list(APPEND R_LIBRARIES ${R_Rcpp_LIBRARY})
find_path(R_Rcpp_INCLUDE_DIR Rcpp.h
HINTS ${RCPP_PATH}
PATH_SUFFIXES include)
list(APPEND R_INCLUDE_DIRS ${R_Rcpp_INCLUDE_DIR})

View File

@ -16,9 +16,7 @@ list(APPEND CMAKE_MODULE_PATH "${POET_SOURCE_DIR}/CMake")
find_package(MPI REQUIRED)
find_package(R REQUIRED)
find_package(Rcpp REQUIRED)
find_package(RInside REQUIRED)
find_package(RRuntime REQUIRED)
add_subdirectory(src)
add_subdirectory(R_lib)

View File

@ -6,7 +6,7 @@ find_library(MATH_LIBRARY m)
find_library(CRYPTO_LIBRARY crypto)
add_library(poet_lib ${poet_lib_SRC})
target_include_directories(poet_lib PUBLIC ${PROJECT_SOURCE_DIR}/include ${R_INCLUDE_DIRS})
target_include_directories(poet_lib PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(poet_lib PUBLIC
MPI::MPI_C ${MATH_LIBRARY} ${CRYPTO_LIBRARY} ${R_LIBRARIES})
MPI::MPI_C ${MATH_LIBRARY} ${CRYPTO_LIBRARY} RRuntime)
target_compile_definitions(poet_lib PUBLIC STRICT_R_HEADERS OMPI_SKIP_MPICXX)