1if(JULIA_FOUND)
2    return()
3endif()
4
5# Find julia executable
6find_program(JULIA_EXECUTABLE julia DOC "Julia executable")
7
8if(NOT JULIA_EXECUTABLE)
9    return()
10endif()
11
12
13
14
15#
16# Julia version
17#
18execute_process(
19    COMMAND ${JULIA_EXECUTABLE} --version
20    OUTPUT_VARIABLE JULIA_VERSION_STRING
21    RESULT_VARIABLE RESULT
22)
23if(RESULT EQUAL 0)
24  string(REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
25      JULIA_VERSION_STRING ${JULIA_VERSION_STRING})
26endif()
27
28
29
30
31#
32# Julia includes
33#
34if(${JULIA_VERSION_STRING} VERSION_LESS 0.7.0)
35    set(JULIA_BINDIR "JULIA_HOME")
36else()
37    set(JULIA_BINDIR "Sys.BINDIR")
38endif()
39
40execute_process(
41    COMMAND ${JULIA_EXECUTABLE} -E "joinpath(match(r\"(.*)(bin)\",${JULIA_BINDIR}).captures[1],\"include\",\"julia\")"
42    OUTPUT_VARIABLE JULIA_INCLUDE_DIRS
43    # COMMAND ${JULIA_EXECUTABLE} -E "abspath(joinpath(JULIA_HOME, \"../..\", \"src\"))"
44    # OUTPUT_VARIABLE JULIA_INCLUDE_DIRS
45    RESULT_VARIABLE RESULT
46)
47if(RESULT EQUAL 0)
48    string(REGEX REPLACE "\"" "" JULIA_INCLUDE_DIRS ${JULIA_INCLUDE_DIRS})
49    set(JULIA_INCLUDE_DIRS ${JULIA_INCLUDE_DIRS}
50        CACHE PATH "Location of Julia include files")
51endif()
52
53string(CONCAT JULIA_INCLUDE_TEST_FILE ${JULIA_INCLUDE_DIRS} "/julia_version.h")
54string(REGEX REPLACE "\n" "" JULIA_INCLUDE_TEST_FILE ${JULIA_INCLUDE_TEST_FILE})
55IF (NOT EXISTS ${JULIA_INCLUDE_TEST_FILE})
56    message(STATUS "Julia found, but include files are missing")
57    return()
58endif()
59
60
61#
62# Julia library location
63#
64if(${JULIA_VERSION_STRING} VERSION_LESS 0.7.0)
65    set(JULIA_LIBDL_COMMAND "abspath(dirname(Libdl.dlpath(\"libjulia\")))")
66else()
67    set(JULIA_LIBDL_COMMAND "using Libdl\; abspath(dirname(Libdl.dlpath(\"libjulia\")))")
68endif()
69
70execute_process(
71    COMMAND ${JULIA_EXECUTABLE} -E ${JULIA_LIBDL_COMMAND}
72    OUTPUT_VARIABLE JULIA_LIBRARY_DIR
73    RESULT_VARIABLE RESULT
74)
75
76if(RESULT EQUAL 0)
77    string(REGEX REPLACE "\"" "" JULIA_LIBRARY_DIR ${JULIA_LIBRARY_DIR})
78    string(STRIP ${JULIA_LIBRARY_DIR} JULIA_LIBRARY_DIR)
79    set(JULIA_LIBRARY_DIR ${JULIA_LIBRARY_DIR}
80        CACHE PATH "Julia library directory")
81endif()
82
83if(NOT ${JULIA_VERSION_STRING} VERSION_LESS 1.6.0)
84    set(JULIA_INTERNAL_LIBDL_COMMAND "using Libdl\; abspath(dirname(Libdl.dlpath(\"libjulia-internal\")))")
85    execute_process(
86        COMMAND ${JULIA_EXECUTABLE} -E ${JULIA_INTERNAL_LIBDL_COMMAND}
87        OUTPUT_VARIABLE JULIA_INTERNAL_LIBRARY_DIR
88        RESULT_VARIABLE RESULT
89    )
90
91    if(RESULT EQUAL 0)
92        string(REGEX REPLACE "\"" "" JULIA_INTERNAL_LIBRARY_DIR ${JULIA_INTERNAL_LIBRARY_DIR})
93        string(STRIP ${JULIA_INTERNAL_LIBRARY_DIR} JULIA_INTERNAL_LIBRARY_DIR)
94        set(JULIA_INTERNAL_LIBRARY_DIR ${JULIA_INTERNAL_LIBRARY_DIR}
95            CACHE PATH "Julia internal library directory")
96    endif()
97endif()
98
99find_library( JULIA_LIBRARY
100    NAMES julia
101    PATHS ${JULIA_LIBRARY_DIR}
102)
103
104if(NOT ${JULIA_VERSION_STRING} VERSION_LESS 1.6.0)
105    find_library( JULIA_INTERNAL_LIBRARY
106        NAMES julia-internal
107        PATHS ${JULIA_INTERNAL_LIBRARY_DIR}
108    )
109endif()
110
111if(${JULIA_VERSION_STRING} VERSION_LESS 1.6.0)
112    find_package_handle_standard_args(
113        Julia
114        REQUIRED_VARS   JULIA_LIBRARY JULIA_INCLUDE_DIRS
115        VERSION_VAR     JULIA_VERSION_STRING
116        FAIL_MESSAGE    "Julia not found"
117    )
118else()
119    find_package_handle_standard_args(
120        Julia
121        REQUIRED_VARS   JULIA_LIBRARY JULIA_INTERNAL_LIBRARY JULIA_INCLUDE_DIRS
122        VERSION_VAR     JULIA_VERSION_STRING
123        FAIL_MESSAGE    "Julia not found"
124    )
125endif()
126