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)
0 commit comments