From d6cd0ac3a809f5cf6e9ca28921d25fd26558d947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20L=C3=BCbke?= Date: Thu, 10 Nov 2022 15:38:38 +0100 Subject: [PATCH] build: Improve R library handling in CMake --- CMake/FindR.cmake | 25 ----------- CMake/FindRInside.cmake | 23 ----------- CMake/FindRRuntime.cmake | 89 ++++++++++++++++++++++++++++++++++++++++ CMake/FindRcpp.cmake | 23 ----------- CMakeLists.txt | 4 +- src/CMakeLists.txt | 4 +- 6 files changed, 92 insertions(+), 76 deletions(-) delete mode 100644 CMake/FindR.cmake delete mode 100644 CMake/FindRInside.cmake create mode 100644 CMake/FindRRuntime.cmake delete mode 100644 CMake/FindRcpp.cmake diff --git a/CMake/FindR.cmake b/CMake/FindR.cmake deleted file mode 100644 index f07d36bd3..000000000 --- a/CMake/FindR.cmake +++ /dev/null @@ -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}) \ No newline at end of file diff --git a/CMake/FindRInside.cmake b/CMake/FindRInside.cmake deleted file mode 100644 index c7757700f..000000000 --- a/CMake/FindRInside.cmake +++ /dev/null @@ -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}) \ No newline at end of file diff --git a/CMake/FindRRuntime.cmake b/CMake/FindRRuntime.cmake new file mode 100644 index 000000000..4c63cc30a --- /dev/null +++ b/CMake/FindRRuntime.cmake @@ -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) diff --git a/CMake/FindRcpp.cmake b/CMake/FindRcpp.cmake deleted file mode 100644 index be88a3780..000000000 --- a/CMake/FindRcpp.cmake +++ /dev/null @@ -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}) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e002d1fb5..004e6f322 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7f83b2926..dc06c763e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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)