168 lines
5.2 KiB
CMake
168 lines
5.2 KiB
CMake
|
# Inspiration from https://gist.github.com/JayKickliter/06d0e7c4f84ef7ccc7a9
|
||
|
#
|
||
|
|
||
|
find_program(JULIA_EXECUTABLE julia DOC "Julia executable")
|
||
|
IF (NOT JULIA_EXECUTABLE)
|
||
|
cmessage(STATUS "Julia executable has not been found")
|
||
|
return()
|
||
|
endif()
|
||
|
|
||
|
#
|
||
|
# Julia version
|
||
|
#
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} --version
|
||
|
OUTPUT_VARIABLE JULIA_VERSION_STRING
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
|
||
|
JULIA_VERSION_STRING ${JULIA_VERSION_STRING})
|
||
|
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "JULIA_VERSION_MAJOR=\\1;JULIA_VERSION_MINOR=\\2;JULIA_VERSION_FIX=\\3" JULIA_VERSION_DEFS ${JULIA_VERSION_STRING})
|
||
|
endif()
|
||
|
|
||
|
cmessage(STATUS "Julia version: ${JULIA_VERSION_STRING}")
|
||
|
|
||
|
#
|
||
|
# Julia home
|
||
|
#
|
||
|
IF (JULIA_VERSION_STRING VERSION_GREATER_EQUAL "0.7.0")
|
||
|
IF (JULIA_VERSION_STRING VERSION_LESS "1.7.0")
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "abspath(Sys.BINDIR)"
|
||
|
OUTPUT_VARIABLE JULIA_BINDIR
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE "\"" "" JULIA_BINDIR ${JULIA_BINDIR})
|
||
|
string(STRIP "${JULIA_BINDIR}" JULIA_BINDIR)
|
||
|
get_filename_component(JULIA_HOME "${JULIA_BINDIR}/../" ABSOLUTE)
|
||
|
else()
|
||
|
cmessage(ERROR "Cannot find JULIA_HOME")
|
||
|
endif()
|
||
|
ELSE()
|
||
|
cmessage(ERROR "Unknown Julia version ${JULIA_VERSION}")
|
||
|
ENDIF()
|
||
|
ELSE()
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "abspath(JULIA_HOME)"
|
||
|
OUTPUT_VARIABLE JULIA_HOME
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE "\"" "" JULIA_HOME ${JULIA_HOME})
|
||
|
string(STRIP "${JULIA_HOME}" JULIA_HOME)
|
||
|
set(JULIA_BINDIR "${JULIA_HOME}")
|
||
|
else()
|
||
|
cmessage(ERROR "Cannot find JULIA_HOME")
|
||
|
endif()
|
||
|
ENDIF()
|
||
|
|
||
|
|
||
|
cmessage(STATUS "Julia: Executable is ${JULIA_EXECUTABLE} (${JULIA_VERSION_STRING})")
|
||
|
cmessage(STATUS "Julia: HOME is ${JULIA_HOME}")
|
||
|
cmessage(STATUS "Julia: BINDIR is ${JULIA_BINDIR}")
|
||
|
|
||
|
#
|
||
|
# Check threading
|
||
|
#
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "ccall(:jl_threading_enabled, Cint, ()) != 0"
|
||
|
OUTPUT_VARIABLE JULIA_THREADING_STATE
|
||
|
RESULT_VARIABLE RESULT
|
||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
|
)
|
||
|
cmessage(STATUS "Julia: threading state is '${JULIA_THREADING_STATE}'")
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(STRIP "${JULIA_THREADING_STATE}" JULIA_THREADING_STATE)
|
||
|
if (JULIA_THREADING_STATE STREQUAL "true")
|
||
|
set(JULIA_DEFS "JULIA_ENABLE_THREADING=1")
|
||
|
elseif(JULIA_THREADING_STATE STREQUAL "false")
|
||
|
set(JULIA_DEFS "")
|
||
|
else()
|
||
|
cmessage(CWARNING "Julia: unknown return value of threading")
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
set(JULIA_DEFS ${JULIA_DEFS};JULIA_HOME=\"${JULIA_HOME}\";JULIA_BINDIR=\"${JULIA_BINDIR}\";${JULIA_VERSION_DEFS})
|
||
|
|
||
|
|
||
|
#
|
||
|
# Julia includes
|
||
|
#
|
||
|
|
||
|
IF (JULIA_VERSION_STRING VERSION_GREATER_EQUAL "0.7.0")
|
||
|
IF (JULIA_VERSION_STRING VERSION_LESS "1.7.0")
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "abspath(Sys.BINDIR, Base.INCLUDEDIR, \"julia\")"
|
||
|
OUTPUT_VARIABLE JULIA_INCLUDE_DIRS
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
ELSE()
|
||
|
cmessage(ERROR "Unknown Julia version ${JULIA_VERSION}")
|
||
|
ENDIF()
|
||
|
ELSE()
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "abspath(\"${JULIA_HOME}\", Base.INCLUDEDIR, \"julia\")"
|
||
|
OUTPUT_VARIABLE JULIA_INCLUDE_DIRS
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
ENDIF()
|
||
|
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE "\"" "" JULIA_INCLUDE_DIRS ${JULIA_INCLUDE_DIRS})
|
||
|
string(STRIP "${JULIA_INCLUDE_DIRS}" JULIA_INCLUDE_DIRS)
|
||
|
set(JULIA_INCLUDE_DIRS ${JULIA_INCLUDE_DIRS}
|
||
|
CACHE PATH "Location of Julia include files")
|
||
|
ELSE()
|
||
|
cmessage(ERROR "Cannot find location of Julia header files")
|
||
|
endif()
|
||
|
|
||
|
#
|
||
|
# Julia libs
|
||
|
#
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "using Libdl; dirname(abspath(Libdl.dlpath(\"libjulia\")))"
|
||
|
OUTPUT_VARIABLE JULIA_LIBRARY_DIR
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE "\"" "" JULIA_LIBRARY_DIR "${JULIA_LIBRARY_DIR}")
|
||
|
string(STRIP "${JULIA_LIBRARY_DIR}" JULIA_LIBRARY_DIR)
|
||
|
cmessage(STATUS "Julia: library dir is ${JULIA_LIBRARY_DIR}")
|
||
|
set(JULIA_LIBRARY_DIRS ${JULIA_LIBRARY_DIR}
|
||
|
CACHE PATH "Location of Julia lib dirs")
|
||
|
endif()
|
||
|
|
||
|
execute_process(
|
||
|
COMMAND ${JULIA_EXECUTABLE} -E "abspath(\"${JULIA_BINDIR}\", Base.PRIVATE_LIBDIR)"
|
||
|
OUTPUT_VARIABLE JULIA_PRIVATE_LIBRARY_DIR
|
||
|
RESULT_VARIABLE RESULT
|
||
|
)
|
||
|
if(RESULT EQUAL 0)
|
||
|
string(REGEX REPLACE "\"" "" JULIA_PRIVATE_LIBRARY_DIR "${JULIA_PRIVATE_LIBRARY_DIR}")
|
||
|
string(STRIP "${JULIA_PRIVATE_LIBRARY_DIR}" JULIA_PRIVATE_LIBRARY_DIR)
|
||
|
cmessage(STATUS "Julia: private library dir is ${JULIA_PRIVATE_LIBRARY_DIR}")
|
||
|
set(JULIA_PRIVATE_LIBRARY_DIRS ${JULIA_PRIVATE_LIBRARY_DIR}
|
||
|
CACHE PATH "Location of Julia lib dirs")
|
||
|
|
||
|
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||
|
SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} "${JULIA_PRIVATE_LIBRARY_DIRS}")
|
||
|
endif()
|
||
|
|
||
|
|
||
|
find_library( JULIA_LIBRARY
|
||
|
NAMES julia.${JULIA_VERSION_STRING} julia
|
||
|
PATHS ${JULIA_LIBRARY_DIRS}
|
||
|
NO_DEFAULT_PATH
|
||
|
)
|
||
|
cmessage(STATUS "Julia: library is ${JULIA_LIBRARY}")
|
||
|
|
||
|
include(FindPackageHandleStandardArgs)
|
||
|
find_package_handle_standard_args(
|
||
|
Julia
|
||
|
REQUIRED_VARS JULIA_LIBRARY JULIA_LIBRARY_DIR JULIA_PRIVATE_LIBRARY_DIR JULIA_INCLUDE_DIRS JULIA_DEFS
|
||
|
VERSION_VAR JULIA_VERSION_STRING
|
||
|
FAIL_MESSAGE "Julia not found"
|
||
|
)
|