201 lines
6.3 KiB
CMake
Executable File
201 lines
6.3 KiB
CMake
Executable File
#
|
|
# FindLibR.cmake
|
|
#
|
|
# Copyright (C) 2009-18 by RStudio, Inc.
|
|
#
|
|
# This program is licensed to you under the terms of version 3 of the
|
|
# GNU Affero General Public License. This program is distributed WITHOUT
|
|
# ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
|
|
# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
|
|
# AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
|
|
#
|
|
#
|
|
|
|
# LIBR_FOUND
|
|
# LIBR_HOME
|
|
# LIBR_INCLUDE_DIRS
|
|
# LIBR_DOC_DIR
|
|
# LIBR_LIBRARIES
|
|
|
|
# detection for OSX (look for R framework)
|
|
if(APPLE)
|
|
|
|
find_library(LIBR_LIBRARIES R)
|
|
|
|
if(LIBR_LIBRARIES MATCHES ".*\\.framework")
|
|
set(LIBR_HOME "${LIBR_LIBRARIES}/Resources" CACHE PATH "R home directory")
|
|
set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include" CACHE PATH "R include directory")
|
|
set(LIBR_DOC_DIR "${LIBR_HOME}/doc" CACHE PATH "R doc directory")
|
|
set(LIBR_EXECUTABLE "${LIBR_HOME}/R" CACHE PATH "R executable")
|
|
else()
|
|
get_filename_component(_LIBR_LIBRARIES "${LIBR_LIBRARIES}" REALPATH)
|
|
get_filename_component(_LIBR_LIBRARIES_DIR "${_LIBR_LIBRARIES}" PATH)
|
|
set(LIBR_EXECUTABLE "${_LIBR_LIBRARIES_DIR}/../bin/R")
|
|
execute_process(
|
|
COMMAND ${LIBR_EXECUTABLE} "--slave" "--vanilla" "-e" "cat(R.home())"
|
|
OUTPUT_VARIABLE LIBR_HOME
|
|
)
|
|
set(LIBR_HOME ${LIBR_HOME} CACHE PATH "R home directory")
|
|
set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include" CACHE PATH "R include directory")
|
|
set(LIBR_DOC_DIR "${LIBR_HOME}/doc" CACHE PATH "R doc directory")
|
|
set(LIBR_LIB_DIR "${LIBR_HOME}/lib" CACHE PATH "R lib directory")
|
|
endif()
|
|
|
|
# detection for UNIX & Win32
|
|
else()
|
|
|
|
# Find R executable and paths (UNIX)
|
|
if(UNIX)
|
|
|
|
# find executable
|
|
find_program(LIBR_EXECUTABLE R)
|
|
if(LIBR_EXECUTABLE-NOTFOUND)
|
|
message(STATUS "Unable to locate R executable")
|
|
endif()
|
|
|
|
# ask R for the home path
|
|
if(NOT LIBR_HOME)
|
|
execute_process(
|
|
COMMAND ${LIBR_EXECUTABLE} "--slave" "--vanilla" "-e" "cat(R.home())"
|
|
OUTPUT_VARIABLE LIBR_HOME
|
|
)
|
|
if(LIBR_HOME)
|
|
set(LIBR_HOME ${LIBR_HOME} CACHE PATH "R home directory")
|
|
endif()
|
|
endif()
|
|
|
|
# ask R for the include dir
|
|
if(NOT LIBR_INCLUDE_DIRS)
|
|
execute_process(
|
|
COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('include'))"
|
|
OUTPUT_VARIABLE LIBR_INCLUDE_DIRS
|
|
)
|
|
if(LIBR_INCLUDE_DIRS)
|
|
set(LIBR_INCLUDE_DIRS ${LIBR_INCLUDE_DIRS} CACHE PATH "R include directory")
|
|
endif()
|
|
endif()
|
|
|
|
# ask R for the doc dir
|
|
if(NOT LIBR_DOC_DIR)
|
|
execute_process(
|
|
COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('doc'))"
|
|
OUTPUT_VARIABLE LIBR_DOC_DIR
|
|
)
|
|
if(LIBR_DOC_DIR)
|
|
set(LIBR_DOC_DIR ${LIBR_DOC_DIR} CACHE PATH "R doc directory")
|
|
endif()
|
|
endif()
|
|
|
|
# ask R for the lib dir
|
|
if(NOT LIBR_LIB_DIR)
|
|
execute_process(
|
|
COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('lib'))"
|
|
OUTPUT_VARIABLE LIBR_LIB_DIR
|
|
)
|
|
endif()
|
|
|
|
# Find R executable and paths (Win32)
|
|
else()
|
|
|
|
# find the home path
|
|
if(NOT LIBR_HOME)
|
|
|
|
# read home from the registry
|
|
get_filename_component(LIBR_HOME
|
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\R-core\\R;InstallPath]"
|
|
ABSOLUTE CACHE)
|
|
|
|
# print message if not found
|
|
if(NOT LIBR_HOME)
|
|
message(STATUS "Unable to locate R home (not written to registry)")
|
|
endif()
|
|
|
|
endif()
|
|
|
|
# set other R paths based on home path
|
|
set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include" CACHE PATH "R include directory")
|
|
set(LIBR_DOC_DIR "${LIBR_HOME}/doc" CACHE PATH "R doc directory")
|
|
|
|
# set library hint path for 64-bit build
|
|
set(LIBR_ARCH "x64")
|
|
set(LIBRARY_ARCH_HINT_PATH "${LIBR_HOME}/bin/x64")
|
|
|
|
# call dll2lib.R to ensure export files are generated
|
|
execute_process(
|
|
COMMAND "${LIBR_HOME}/bin/${LIBR_ARCH}/Rscript.exe" "dll2lib.R"
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/tools"
|
|
RESULT_VARIABLE LIBR_DLL2LIB_RESULT)
|
|
|
|
endif()
|
|
|
|
# look for the R executable
|
|
find_program(LIBR_EXECUTABLE R
|
|
HINTS ${LIBRARY_ARCH_HINT_PATH} ${LIBR_HOME}/bin)
|
|
if(LIBR_EXECUTABLE-NOTFOUND)
|
|
message(STATUS "Unable to locate R executable")
|
|
endif()
|
|
|
|
# look for the core R library
|
|
find_library(LIBR_CORE_LIBRARY NAMES R
|
|
HINTS ${LIBR_LIB_DIR} ${LIBRARY_ARCH_HINT_PATH} ${LIBR_HOME}/bin)
|
|
if(LIBR_CORE_LIBRARY)
|
|
set(LIBR_LIBRARIES ${LIBR_CORE_LIBRARY})
|
|
else()
|
|
message(STATUS "Could not find libR shared library.")
|
|
endif()
|
|
|
|
if(WIN32)
|
|
# look for lapack
|
|
find_library(LIBR_LAPACK_LIBRARY NAMES Rlapack
|
|
HINTS ${LIBR_LIB_DIR} ${LIBRARY_ARCH_HINT_PATH} ${LIBR_HOME}/bin)
|
|
if(LIBR_LAPACK_LIBRARY)
|
|
set(LIBR_LIBRARIES ${LIBR_LIBRARIES} ${LIBR_LAPACK_LIBRARY})
|
|
if(UNIX)
|
|
set(LIBR_LIBRARIES ${LIBR_LIBRARIES} gfortran)
|
|
endif()
|
|
endif()
|
|
|
|
# look for blas
|
|
find_library(LIBR_BLAS_LIBRARY NAMES Rblas
|
|
HINTS ${LIBR_LIB_DIR} ${LIBRARY_ARCH_HINT_PATH} ${LIBR_HOME}/bin)
|
|
if(LIBR_BLAS_LIBRARY)
|
|
set(LIBR_LIBRARIES ${LIBR_LIBRARIES} ${LIBR_BLAS_LIBRARY})
|
|
endif()
|
|
|
|
# look for rgraphapp
|
|
find_library(LIBR_GRAPHAPP_LIBRARY NAMES Rgraphapp
|
|
HINTS ${LIBR_LIB_DIR} ${LIBRARY_ARCH_HINT_PATH} ${LIBR_HOME}/bin)
|
|
if(LIBR_GRAPHAPP_LIBRARY)
|
|
set(LIBR_LIBRARIES ${LIBR_LIBRARIES} ${LIBR_GRAPHAPP_LIBRARY})
|
|
endif()
|
|
endif()
|
|
|
|
# cache LIBR_LIBRARIES
|
|
if(LIBR_LIBRARIES)
|
|
set(LIBR_LIBRARIES ${LIBR_LIBRARIES} CACHE PATH "R runtime libraries")
|
|
endif()
|
|
|
|
endif()
|
|
|
|
# define find requirements
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(LibR DEFAULT_MSG
|
|
LIBR_HOME
|
|
LIBR_EXECUTABLE
|
|
LIBR_INCLUDE_DIRS
|
|
LIBR_LIBRARIES
|
|
LIBR_DOC_DIR
|
|
)
|
|
|
|
if(LIBR_FOUND)
|
|
message(STATUS "Found R: ${LIBR_HOME}")
|
|
get_filename_component(LIBR_BIN_DIR "${LIBR_EXECUTABLE}" PATH CACHE)
|
|
endif()
|
|
|
|
# mark low-level variables from FIND_* calls as advanced
|
|
mark_as_advanced(
|
|
LIBR_CORE_LIBRARY
|
|
LIBR_LAPACK_LIBRARY
|
|
LIBR_BLAS_LIBRARY
|
|
)
|