@@ -5,10 +5,63 @@ using Printf
5
5
using Libdl
6
6
7
7
8
- const ext = joinpath (@__DIR__ , " .." , " deps" , " ext.jl" )
9
- isfile (ext) || error (" LLVM.jl has not been built, please run Pkg.build(\" LLVM\" )." )
10
- include (ext)
11
- const libllvm = libllvm_path
8
+ # # discovery
9
+
10
+ using Libdl
11
+
12
+ VERSION >= v " 0.7.0-DEV.2576" || error (" This version of LLVM.jl requires Julia 0.7" )
13
+
14
+ # figure out the path to libLLVM by looking at the libraries loaded by Julia
15
+ const libllvm_paths = filter (Libdl. dllist ()) do lib
16
+ occursin (" LLVM" , basename (lib))
17
+ end
18
+ if isempty (libllvm_paths)
19
+ error ("""
20
+ Cannot find the LLVM library loaded by Julia.
21
+ Please use a version of Julia that has been built with USE_LLVM_SHLIB=1 (like the official binaries).
22
+ If you are, please file an issue and attach the output of `Libdl.dllist()`.""" )
23
+ end
24
+ if length (libllvm_paths) > 1
25
+ error ("""
26
+ Multiple LLVM libraries loaded by Julia.
27
+ Please file an issue and attach the output of `Libdl.dllist()`.""" )
28
+ end
29
+ const libllvm = first (libllvm_paths)
30
+ const libllvm_version = Base. libllvm_version:: VersionNumber
31
+ @debug " Discovered LLVM v$libllvm_version at $libllvm "
32
+
33
+ vercmp_match (a,b) = a. major== b. major && a. minor== b. minor
34
+ vercmp_compat (a,b) = a. major> b. major || (a. major== b. major && a. minor>= b. minor)
35
+
36
+ const llvmjl_wrappers = filter (path-> isdir (joinpath (@__DIR__ , " .." , " lib" , path)),
37
+ readdir (joinpath (@__DIR__ , " .." , " lib" )))
38
+ @assert ! isempty (llvmjl_wrappers)
39
+
40
+ # figure out which wrapper to use
41
+ const matching_wrappers = filter (wrapper-> vercmp_match (libllvm_version,
42
+ VersionNumber (wrapper)),
43
+ llvmjl_wrappers)
44
+ const llvmjl_wrapper = if ! isempty (matching_wrappers)
45
+ @assert length (matching_wrappers) == 1
46
+ matching_wrappers[1 ]
47
+ else
48
+ compatible_wrappers = filter (wrapper-> vercmp_compat (libllvm_version,
49
+ VersionNumber (wrapper)),
50
+ llvmjl_wrappers)
51
+ isempty (compatible_wrappers) && error (" Could not find any compatible wrapper for LLVM $(libllvm_version) " )
52
+ last (compatible_wrappers)
53
+ end
54
+ @debug " Using LLVM.jl wrapper for v$llvmjl_wrapper "
55
+
56
+ # TODO : figure out the name of the native target
57
+ const libllvm_targets = [:NVPTX , :AMDGPU ]
58
+
59
+ # backwards-compatible flags
60
+ const libllvm_system = false
61
+ const configured = true
62
+
63
+
64
+ # # source code includes
12
65
13
66
include (" util/types.jl" )
14
67
@@ -49,14 +102,19 @@ include("interop.jl")
49
102
50
103
include (" deprecated.jl" )
51
104
105
+
106
+ # # initialization
107
+
52
108
function __init__ ()
53
109
libllvm_paths = filter (Libdl. dllist ()) do lib
54
110
occursin (" LLVM" , basename (lib))
55
111
end
56
112
if length (libllvm_paths) > 1
57
113
# NOTE: this still allows switching to a non-USE_LLVM_SHLIB version, but
58
114
# there's no way to detect that since the new libLLVM is loaded before this...
59
- error (" LLVM.jl and Julia are using different LLVM libraries, please re-run Pkg.build(\" LLVM\" )." )
115
+ cachefile = Base. compilecache (Base. PkgId (LLVM))
116
+ rm (cachefile)
117
+ error (" Your set-up changed, and LLVM.jl needs to be reconfigured. Please load the package again." )
60
118
end
61
119
62
120
_install_handlers ()
0 commit comments