File: FindR.cmake

package info (click to toggle)
cantor 4%3A16.08.3-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,300 kB
  • sloc: cpp: 24,077; xml: 2,109; lisp: 52; python: 37; makefile: 15; sh: 11
file content (125 lines) | stat: -rw-r--r-- 4,680 bytes parent folder | download | duplicates (2)
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
# - Try to find R
# Once done this will define
#
#  R_FOUND - system has R
#  R_EXECUTABLE - executable of R
#  R_HOME - home directory of R
#  R_INCLUDE_DIR - the R include directory
#  R_LIBRARIES - Link these to use R

# find the R binary
FIND_PROGRAM(R_EXECUTABLE R)

SET(ABORT_CONFIG FALSE)
IF(R_EXECUTABLE)

  # find R_HOME
  IF(NOT R_HOME)
    EXECUTE_PROCESS(
      COMMAND ${R_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home())"
      OUTPUT_VARIABLE R_HOME)
  ENDIF(NOT R_HOME)
  IF(NOT R_HOME)
    MESSAGE(STATUS "Could NOT determine R_HOME (probably you misspecified the location of R)")
  ENDIF(NOT R_HOME)

  # find R include dir
  IF(NOT R_INCLUDE_DIR)
    IF(WIN32)    # This version of the test will not work with R < 2.9.0, but the other version (in the else part) will not work on windows (and on windows the paths are generally standard, anyway).
      EXECUTE_PROCESS(
        COMMAND ${R_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('include'))"
        OUTPUT_VARIABLE R_INCLUDE_DIR)
    ELSE(WIN32)
      EXECUTE_PROCESS(
        COMMAND ${R_EXECUTABLE} CMD sh -c "echo -n $R_INCLUDE_DIR"
        OUTPUT_VARIABLE R_INCLUDE_DIR)
    ENDIF(WIN32)
  ENDIF(NOT R_INCLUDE_DIR)

  IF(NOT R_INCLUDE_DIR)
    SET(R_INCLUDE_DIR ${R_HOME}/include)
    MESSAGE(STATUS "R_Home not findable via R. Guessing")
  ENDIF(NOT R_INCLUDE_DIR)

  FIND_PATH(R_INCLUDE_DIR R.h)

  # check for existence of libR.so

  FIND_LIBRARY(R_R_LIBRARY
    R
    HINTS ${R_HOME}/lib ${R_SHARED_LIB_DIR} ${R_HOME}/bin )
  IF(NOT R_R_LIBRARY)
    MESSAGE(STATUS "libR not found. Make sure the location of R was detected correctly, above, and R was compiled with the --enable-shlib option")
  ELSE(NOT R_R_LIBRARY)
    GET_FILENAME_COMPONENT(R_SHARED_LIB_DIR ${R_R_LIBRARY}
      PATH)
    SET(R_LIBRARIES ${R_R_LIBRARY})
  ENDIF(NOT R_R_LIBRARY)

  # for at least some versions of R, we seem to have to link against -lRlapack. Else loading some
  # R packages will fail due to unresolved symbols, or we can't link against -lR.
  # However, we can't do this unconditionally,
  # as this is not available in some configurations of R

  FIND_LIBRARY(R_LAPACK_LIBRARY
    Rlapack
    HINTS ${R_SHARED_LIB_DIR} )
  IF(NOT R_LAPACK_LIBRARY)
    #MESSAGE(STATUS "No, it does not exist in ${R_SHARED_LIB_DIR}")
  ELSE(NOT R_LAPACK_LIBRARY)
    #MESSAGE(STATUS "Yes, ${R_LAPACK_LIBRARY} exists")
    SET(R_LIBRARIES ${R_LIBRARIES} ${R_LAPACK_LIBRARY})
    IF(NOT WIN32)
      # Query gfortran to get the libgfortran.so path
      FIND_PROGRAM(_GFORTRAN_EXECUTABLE NAMES gfortran)
      IF(_GFORTRAN_EXECUTABLE)
        EXECUTE_PROCESS(COMMAND ${_GFORTRAN_EXECUTABLE} -print-file-name=libgfortran.so
                        OUTPUT_VARIABLE _libgfortran_path
                        OUTPUT_STRIP_TRAILING_WHITESPACE
                       )
      ENDIF()
      IF(EXISTS ${_libgfortran_path})
        SET(GFORTRAN_LIBRARY ${_libgfortran_path})
      ELSE()
        # if libgfortran wasn't found at this point, the installation is probably broken
        # Let's try to find the library nonetheless.
        FIND_LIBRARY(GFORTRAN_LIBRARY gfortran)
      ENDIF()
      IF (GFORTRAN_LIBRARY)
        # needed when linking to Rlapack on linux for some unknown reason.
        # apparently not needed on windows (let's see, when it comes back to bite us, though)
        # and compiling on windows is hard enough even without requiring libgfortran, too.
        SET(R_LIBRARIES ${R_LIBRARIES} ${GFORTRAN_LIBRARY})
      ELSE (GFORTRAN_LIBRARY)
        MESSAGE(STATUS "gfortran is needed for Rlapack but it could not be found")
        SET(ABORT_CONFIG TRUE)
      ENDIF (GFORTRAN_LIBRARY)
    ENDIF(NOT WIN32)
  ENDIF(NOT R_LAPACK_LIBRARY)

  # for at least some versions of R, we seem to have to link against -lRlapack. Else loading some
  # R packages will fail due to unresolved symbols, or we can't link against -lR.
  # However, we can't do this unconditionally,
  # as this is not available in some configurations of R

  FIND_LIBRARY(R_BLAS_LIBRARY
    Rblas
    HINTS ${R_SHARED_LIB_DIR} )
  IF(NOT R_BLAS_LIBRARY)
    #MESSAGE(STATUS "No, it does not exist in ${R_SHARED_LIB_DIR}")
  ELSE(NOT R_BLAS_LIBRARY)
    #MESSAGE(STATUS "Yes, ${R_BLAS_LIBRARY} exists")
    SET(R_LIBRARIES ${R_LIBRARIES} ${R_BLAS_LIBRARY})
  ENDIF(NOT R_BLAS_LIBRARY)

ENDIF( R_EXECUTABLE )

IF(ABORT_CONFIG)
  SET(R_FOUND FALSE)
ELSE(ABORT_CONFIG)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(R  DEFAULT_MSG
                                  R_EXECUTABLE R_INCLUDE_DIR R_R_LIBRARY)

  MARK_AS_ADVANCED(R_INCLUDE_DIR R_R_LIBRARY R_LAPACK_LIBRARY R_BLAS_LIBRARY)
ENDIF(ABORT_CONFIG)