1
0
mirror of https://github.com/opencv/opencv_contrib.git synced 2025-10-17 07:04:18 +08:00
Files
opencv_contrib/modules/julia/cmake/FindJulia.cmake
archit120 522a062cad Merge pull request #2547 from archit120:julia-phase1
Julia Bindings GSoC - phase1

* Julia Phase 1 first commit

* a few fixes to compile julia bindings on mac

* Readme changes

* Allow usage before installation and update README

* Add CxxWrap installation and fix Mac build bug

* CMake fixes and test refactoring

* add tests, fix trailing whitespace, disable array-vec conversion

* Fix trailing whiteline and warning

* Add module documentation and fix tests in CMake

* Change copyright block, CMake variable name

* copy => copy_if_different

* fix status dump and return lines

* Remove Julia_Found outside init.cmake

* change indentation

Co-authored-by: Vadim Pisarevsky <vadim.pisarevsky@gmail.com>
2020-06-17 07:33:37 +00:00

170 lines
5.4 KiB
CMake

# Original FindJulia.cmake from https://github.com/QuantStack/xtensor-julia-cookiecutter/blob/master/%7B%7Bcookiecutter.github_project_name%7D%7D/cmake/FindJulia.cmake
if(Julia_FOUND)
return()
endif()
####################
# Julia Executable #
####################
find_program(Julia_EXECUTABLE julia DOC "Julia executable")
#################
# Julia Version #
#################
if(Julia_EXECUTABLE)
message(STATUS "Found Julia executable: " ${Julia_EXECUTABLE})
execute_process(
COMMAND "${Julia_EXECUTABLE}" --startup-file=no --version
OUTPUT_VARIABLE Julia_VERSION_STRING
)
else()
return()
endif()
string(
REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
Julia_VERSION_STRING "${Julia_VERSION_STRING}"
)
MESSAGE(STATUS "Julia_VERSION_STRING: ${Julia_VERSION_STRING}")
##################
# Julia Includes #
##################
set(JULIA_HOME_NAME "Sys.BINDIR")
if(${Julia_VERSION_STRING} VERSION_LESS "0.7.0")
set(JULIA_HOME_NAME "JULIA_HOME")
else()
set(USING_LIBDL "using Libdl")
endif()
if(DEFINED ENV{JULIA_INCLUDE_DIRS})
set(Julia_INCLUDE_DIRS $ENV{JULIA_INCLUDE_DIRS}
CACHE STRING "Location of Julia include files")
elseif(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "julia_include_dir = joinpath(match(r\"(.*)(bin)\",${JULIA_HOME_NAME}).captures[1],\"include\",\"julia\")\n
if !isdir(julia_include_dir) # then we're running directly from build\n
julia_base_dir_aux = splitdir(splitdir(${JULIA_HOME_NAME})[1])[1] # useful for running-from-build\n
julia_include_dir = joinpath(julia_base_dir_aux, \"usr\", \"include\" )\n
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\", \"support\" )\n
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\" )\n
end\n
julia_include_dir"
OUTPUT_VARIABLE Julia_INCLUDE_DIRS
)
string(REGEX REPLACE "\"" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
string(REGEX REPLACE "\n" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS}
CACHE PATH "Location of Julia include files")
elseif(Julia_PREFIX)
set(Julia_INCLUDE_DIRS ${Julia_PREFIX}/include/julia)
endif()
MESSAGE(STATUS "Julia_INCLUDE_DIRS: ${Julia_INCLUDE_DIRS}")
###################
# Julia Libraries #
###################
if(WIN32)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .a)
endif()
if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${USING_LIBDL}\nabspath(Libdl.dlpath((ccall(:jl_is_debugbuild, Cint, ()) != 0) ? \"libjulia-debug\" : \"libjulia\"))"
OUTPUT_VARIABLE Julia_LIBRARY
)
string(REGEX REPLACE "\"" "" Julia_LIBRARY "${Julia_LIBRARY}")
string(REGEX REPLACE "\n" "" Julia_LIBRARY "${Julia_LIBRARY}")
string(STRIP "${Julia_LIBRARY}" Julia_LIBRARY)
if(WIN32)
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY_DIR} DIRECTORY)
find_library(win_Julia_LIBRARY
NAMES libjulia.dll.a
PATHS "${Julia_LIBRARY_DIR}/lib"
NO_DEFAULT_PATH
)
set(Julia_LIBRARY "${win_Julia_LIBRARY}")
endif()
set(Julia_LIBRARY "${Julia_LIBRARY}"
CACHE PATH "Julia library")
else()
find_library(Julia_LIBRARY NAMES libjulia.${Julia_VERSION_STRING}.dylib julia libjulia libjulia.dll.a CMAKE_FIND_ROOT_PATH_BOTH)
endif()
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
MESSAGE(STATUS "Julia_LIBRARY_DIR: ${Julia_LIBRARY_DIR}")
MESSAGE(STATUS "Julia_LIBRARY: ${Julia_LIBRARY}")
##############
# JULIA_HOME #
##############
if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${JULIA_HOME_NAME}"
OUTPUT_VARIABLE JULIA_HOME
)
string(REGEX REPLACE "\"" "" JULIA_HOME "${JULIA_HOME}")
string(REGEX REPLACE "\n" "" JULIA_HOME "${JULIA_HOME}")
MESSAGE(STATUS "JULIA_HOME: ${JULIA_HOME}")
###################
# libLLVM version #
###################
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Base.libllvm_version"
OUTPUT_VARIABLE Julia_LLVM_VERSION
)
string(REGEX REPLACE "\"" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
string(REGEX REPLACE "\n" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
MESSAGE(STATUS "Julia_LLVM_VERSION: ${Julia_LLVM_VERSION}")
endif()
##################################
# Check for Existence of Headers #
##################################
find_path(Julia_MAIN_HEADER julia.h HINTS ${Julia_INCLUDE_DIRS})
#######################################
# Determine if we are on 32 or 64 bit #
#######################################
if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Sys.WORD_SIZE"
OUTPUT_VARIABLE Julia_WORD_SIZE
)
string(REGEX REPLACE "\n" "" Julia_WORD_SIZE "${Julia_WORD_SIZE}")
MESSAGE(STATUS "Julia_WORD_SIZE: ${Julia_WORD_SIZE}")
endif()
###########################
# FindPackage Boilerplate #
###########################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Julia
REQUIRED_VARS Julia_LIBRARY Julia_LIBRARY_DIR Julia_INCLUDE_DIRS Julia_MAIN_HEADER Julia_EXECUTABLE
VERSION_VAR Julia_VERSION_STRING
FAIL_MESSAGE "Julia not found"
)