Skip to content

Commit 7ddda68

Browse files
chore(julia): add detection for Julia CMake (#1333)
1 parent 46792c3 commit 7ddda68

File tree

2 files changed

+179
-2
lines changed

2 files changed

+179
-2
lines changed

CMake/FindJulia.cmake

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
#
2+
# This FindJulia.cmake is intended to detect Julia as a package.
3+
#
4+
# Use
5+
# `list(APPEND CMAKE_MODULE_PATH "path/to/this/file")`
6+
# `find_package(Julia 1.7.0 REQUIRED)`
7+
#
8+
# to make the Julia target available through:
9+
# `"$<BUILD_INTERFACE:Julia::Julia>"`
10+
#
11+
# Furthermore the following variables will be set on
12+
# successful detection:
13+
#
14+
# JULIA_LIBRARY : Julia shared library
15+
# JULIA_EXECUTABLE : Julia REPL executable
16+
# JULIA_BINDIR : directory to Julia binary
17+
# JULIA_INCLUDE_DIR : directory that contains julia.h
18+
#
19+
#[=======================================================================[.rst:
20+
21+
FindJulia
22+
-----------
23+
24+
This module is intended to detect Julia as a package.
25+
26+
Imported Targets
27+
^^^^^^^^^^^^^^^^
28+
29+
``Julia::Julia``
30+
Julia Package, if found
31+
32+
Result Variables
33+
^^^^^^^^^^^^^^^^
34+
35+
``JULIA_LIBRARY``
36+
Julia shared library
37+
``JULIA_EXECUTABLE``
38+
Julia REPL executable
39+
``JULIA_BINDIR``
40+
directory to Julia binary
41+
``JULIA_INCLUDE_DIR``
42+
directory that contains Julia.h
43+
44+
Usage
45+
^^^^^
46+
Use:
47+
``list(APPEND CMAKE_MODULE_PATH "path/to/this/file")``
48+
``find_package(Julia 1.7.0 REQUIRED)``
49+
50+
to make the Julia target available to your target through
51+
``"$<BUILD_INTERFACE:Julia::Julia>"``
52+
53+
#]=======================================================================]
54+
55+
macro(julia_bail_if_false message var)
56+
if(NOT ${var})
57+
set(Julia_FOUND 0)
58+
set(Julia_NOT_FOUND_MESSAGE "${message}")
59+
return()
60+
endif()
61+
endmacro()
62+
63+
# detect Julia executable
64+
find_program(JULIA_EXECUTABLE julia PATHS ENV JULIA_BINDIR)
65+
julia_bail_if_false("Unable to detect the Julia executable. Make sure JULIA_BINDIR is set correctly." JULIA_EXECUTABLE)
66+
67+
# detect Julia binary dir
68+
if(NOT DEFINED JULIA_BINDIR)
69+
# The executable could be a chocolatey shim, so run some Julia code to report
70+
# the path of the BINDIR
71+
execute_process(
72+
COMMAND "${JULIA_EXECUTABLE}" -e "print(Sys.BINDIR)"
73+
OUTPUT_VARIABLE JULIA_BINDIR_LOCAL
74+
)
75+
file(TO_CMAKE_PATH "${JULIA_BINDIR_LOCAL}" JULIA_BINDIR_LOCAL)
76+
set(JULIA_BINDIR "${JULIA_BINDIR_LOCAL}" CACHE PATH "")
77+
endif()
78+
get_filename_component(JULIA_PATH_PREFIX "${JULIA_BINDIR}" DIRECTORY)
79+
80+
if(WIN32)
81+
set(julia_old_CMAKE_FIND_LIBRARY_SUFFIXES "")
82+
set(julia_old_CMAKE_FIND_LIBRARY_PREFIXES "")
83+
if(CMAKE_FIND_LIBRARY_SUFFIXES)
84+
set(julia_old_CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}")
85+
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .dll.a)
86+
else()
87+
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll.a")
88+
endif()
89+
if(CMAKE_FIND_LIBRARY_PREFIXES)
90+
set(julia_old_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
91+
list(APPEND CMAKE_FIND_LIBRARY_PREFIXES lib)
92+
else()
93+
set(CMAKE_FIND_LIBRARY_PREFIXES ";lib")
94+
endif()
95+
endif()
96+
97+
# detect Julia library
98+
find_library(JULIA_LIBRARY julia HINTS "${JULIA_PATH_PREFIX}/lib")
99+
100+
if(WIN32)
101+
set(CMAKE_FIND_LIBRARY_SUFFIXES "${julia_old_CMAKE_FIND_LIBRARY_SUFFIXES}")
102+
set(CMAKE_FIND_LIBRARY_PREFIXES "${julia_old_CMAKE_FIND_LIBRARY_PREFIXES}")
103+
endif()
104+
105+
julia_bail_if_false("Unable to find the julia shared library. Make sure JULIA_BINDIR is set correctly and that the julia image is uncompressed" JULIA_LIBRARY)
106+
107+
# detect Julia include dir
108+
find_path(
109+
JULIA_INCLUDE_DIR julia.h
110+
HINTS "${JULIA_PATH_PREFIX}/include" "${JULIA_PATH_PREFIX}/include/julia"
111+
)
112+
julia_bail_if_false("Unable to find julia.h. Make sure JULIA_BINDIR is set correctly and that your image is uncompressed." JULIA_INCLUDE_DIR)
113+
114+
# detect Julia version
115+
if(NOT DEFINED JULIA_VERSION AND EXISTS "${JULIA_INCLUDE_DIR}/julia_version.h")
116+
file(STRINGS "${JULIA_INCLUDE_DIR}/julia_version.h" JULIA_VERSION_LOCAL LIMIT_COUNT 1 REGEX JULIA_VERSION_STRING)
117+
string(REGEX REPLACE ".*\"([^\"]+)\".*" "\\1" JULIA_VERSION_LOCAL "${JULIA_VERSION_LOCAL}")
118+
set(JULIA_VERSION "${JULIA_VERSION_LOCAL}")
119+
endif()
120+
121+
include(FindPackageHandleStandardArgs)
122+
find_package_handle_standard_args(
123+
Julia
124+
REQUIRED_VARS JULIA_LIBRARY JULIA_EXECUTABLE JULIA_BINDIR JULIA_INCLUDE_DIR
125+
VERSION_VAR JULIA_VERSION
126+
)
127+
128+
# detect target properties
129+
if(NOT TARGET Julia::Julia)
130+
set(julia_has_implib NO)
131+
set(julia_library_type STATIC)
132+
if(JULIA_LIBRARY MATCHES "\\.(so|dylib)$")
133+
set(julia_library_type SHARED)
134+
elseif(JULIA_LIBRARY MATCHES "\\.(lib|dll\\.a)$")
135+
set(julia_library_type UNKNOWN)
136+
find_file(
137+
JULIA_LIBRARY_DLL
138+
NAMES libjulia.dll julia.dll
139+
HINTS "${JULIA_BINDIR}"
140+
)
141+
if(JULIA_LIBRARY_DLL)
142+
set(julia_has_implib YES)
143+
set(julia_library_type SHARED)
144+
endif()
145+
endif()
146+
147+
add_library(Julia::Julia "${julia_library_type}" IMPORTED)
148+
set_target_properties(
149+
Julia::Julia PROPERTIES
150+
INTERFACE_INCLUDE_DIRECTORIES "${JULIA_INCLUDE_DIR}"
151+
IMPORTED_LINK_INTERFACE_LANGUAGES C
152+
)
153+
if(julia_has_implib)
154+
if(JULIA_LIBRARY AND EXISTS "${JULIA_LIBRARY}")
155+
set_property(TARGET Julia::Julia PROPERTY IMPORTED_IMPLIB "${JULIA_LIBRARY}")
156+
endif()
157+
if(JULIA_LIBRARY_DLL AND EXISTS "${JULIA_LIBRARY_DLL}")
158+
set_property(TARGET Julia::Julia PROPERTY IMPORTED_LOCATION "${JULIA_LIBRARY_DLL}")
159+
endif()
160+
elseif(JULIA_LIBRARY AND EXISTS "${JULIA_LIBRARY}")
161+
set_property(TARGET Julia::Julia PROPERTY IMPORTED_LOCATION "${JULIA_LIBRARY}")
162+
endif()
163+
endif()
164+
165+
# finish
166+
mark_as_advanced(JULIA_EXECUTABLE JULIA_BINDIR JULIA_LIBRARY JULIA_INCLUDE_DIR JULIA_VERSION JULIA_LIBRARY_DLL)

CMakeLists.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ message(
1818
"CMake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}"
1919
)
2020
# ==============================================================================
21-
cmake_minimum_required(VERSION 3.9)
21+
cmake_minimum_required(VERSION 3.10)
2222
# ==============================================================================
2323
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/")
2424
# ==============================================================================
@@ -184,6 +184,17 @@ if(NOT WITHOUT_PYTHON_ENGINE_MODULE)
184184
endif()
185185
endif()
186186
# ==============================================================================
187+
if(NOT WITHOUT_JULIA_ENGINE_MODULE)
188+
find_package(Julia 1.7.0)
189+
if (NOT Julia_FOUND)
190+
set(WITHOUT_JULIA_ENGINE_MODULE ON)
191+
message(STATUS "Julia not found.")
192+
else()
193+
message(STATUS "Found Julia include dirs: ${JULIA_INCLUDE_DIR}")
194+
message(STATUS "Found Julia library dir: ${JULIA_LIBRARY}")
195+
endif()
196+
endif()
197+
# ==============================================================================
187198
include(OptionsConfig)
188199
# ==============================================================================
189200
include(C17Config)
@@ -242,7 +253,7 @@ list(
242253
iostreams)
243254
find_package(
244255
Boost 1.64.0
245-
COMPONENTS ${boost_components}
256+
CONFIG COMPONENTS ${boost_components}
246257
REQUIRED)
247258
# ==============================================================================
248259
if(NOT WITHOUT_HELP_TOOLS_MODULE)

0 commit comments

Comments
 (0)