Skip to content

Commit

Permalink
Search standard directory for Linux systems (#197)
Browse files Browse the repository at this point in the history
* Search standard directory for Linux systems

* Normalize to LF line ending

* Skip  linked executables for the master matlab root directory
  • Loading branch information
musm committed Feb 17, 2022
1 parent 08ca1ca commit c732f7d
Showing 1 changed file with 118 additions and 109 deletions.
227 changes: 118 additions & 109 deletions deps/build.jl
Original file line number Diff line number Diff line change
@@ -1,109 +1,118 @@
import Libdl

const depsfile = joinpath(@__DIR__, "deps.jl")

function find_matlab_root()
# Determine MATLAB library path and provide facilities to load libraries with this path
matlab_root = get(ENV, "MATLAB_ROOT",
get(ENV, "MATLAB_HOME", nothing))
if isnothing(matlab_root)
matlab_exe = Sys.which("matlab")
if !isnothing(matlab_exe)
matlab_root = dirname(dirname(matlab_exe))
else
if Sys.isapple()
default_dir = "/Applications"
if isdir(default_dir)
dirs = readdir(default_dir)
filter!(app -> occursin(r"^MATLAB_R[0-9]+[ab]\.app$", app), dirs)
if !isempty(dirs)
matlab_root = joinpath(default_dir, maximum(dirs))
end
end
elseif Sys.iswindows()
default_dir = Sys.WORD_SIZE == 32 ? "C:\\Program Files (x86)\\MATLAB" : "C:\\Program Files\\MATLAB"
if isdir(default_dir)
dirs = readdir(default_dir)
filter!(dir -> occursin(r"^R[0-9]+[ab]$", dir), dirs)
if !isempty(dirs)
matlab_root = joinpath(default_dir, maximum(dirs))
end
end
end
end
end
!isnothing(matlab_root) && isdir(matlab_root) && @info("Detected MATLAB root folder at \"$matlab_root\"")
return matlab_root
end

function find_matlab_libpath(matlab_root)
# get path to MATLAB libraries
matlab_libdir = if Sys.islinux()
Sys.WORD_SIZE == 32 ? "glnx86" : "glnxa64"
elseif Sys.isapple()
Sys.WORD_SIZE == 32 ? "maci" : "maci64"
elseif Sys.iswindows()
Sys.WORD_SIZE == 32 ? "win32" : "win64"
end
matlab_libpath = joinpath(matlab_root, "bin", matlab_libdir)
isdir(matlab_libpath) && @info("Detected MATLAB library path at \"$matlab_libpath\"")
return matlab_libpath
end

function find_matlab_cmd(matlab_root)
if Sys.iswindows()
matlab_cmd = joinpath(matlab_root, "bin", (Sys.WORD_SIZE == 32 ? "win32" : "win64"), "matlab.exe")
isfile(matlab_cmd) && @info("Detected MATLAB executable at \"$matlab_cmd\"")
else
matlab_exe = joinpath(matlab_root, "bin", "matlab")
isfile(matlab_exe) && @info("Detected MATLAB executable at \"$matlab_exe\"")
matlab_cmd = "exec $(Base.shell_escape(matlab_exe))"
end
return matlab_cmd
end

matlab_root = find_matlab_root()

if !isnothing(matlab_root)
matlab_libpath = find_matlab_libpath(matlab_root)
matlab_cmd = find_matlab_cmd(matlab_root)
libmx_size = filesize(Libdl.dlpath(joinpath(matlab_libpath, "libmx")))
open(depsfile, "w") do io
println(io,
"""
# This file is automatically generated, do not edit.
function check_deps()
if libmx_size != filesize(Libdl.dlpath(joinpath(matlab_libpath, "libmx")))
error("MATLAB library has changed, re-run Pkg.build(\\\"MATLAB\\\")")
end
end
"""
)
println(io, "const matlab_libpath = \"$(escape_string(matlab_libpath))\"")
println(io, "const matlab_cmd = \"$(escape_string(matlab_cmd))\"")
println(io, "const libmx_size = $libmx_size")
end
elseif get(ENV, "JULIA_REGISTRYCI_AUTOMERGE", nothing) == "true" || get(ENV, "CI", nothing) == "true"
# We need to be able to install and load this package without error for
# Julia's registry AutoMerge to work, so we just use dummy values.
# Similarly we want to also be able to install and load this package for CI.
matlab_libpath = ""
matlab_cmd = ""
libmx_size = 0

open(depsfile, "w") do io
println(io,
"""
# This file is automatically generated, do not edit.
check_deps() = nothing
"""
)
println(io, "const matlab_libpath = \"$(escape_string(matlab_libpath))\"")
println(io, "const matlab_cmd = \"$(escape_string(matlab_cmd))\"")
println(io, "const libmx_size = $libmx_size")
end
else
error("MATLAB cannot be found. Set the \"MATLAB_ROOT\" environment variable to the MATLAB root directory and re-run Pkg.build(\"MATLAB\").")
end
import Libdl

const depsfile = joinpath(@__DIR__, "deps.jl")

function find_matlab_root()
# Determine MATLAB library path and provide facilities to load libraries with this path
matlab_root = get(ENV, "MATLAB_ROOT",
get(ENV, "MATLAB_HOME", nothing))
if isnothing(matlab_root)
matlab_exe = Sys.which("matlab")
if !isnothing(matlab_exe) && !islink(matlab_exe) # guard against /usr/local
matlab_root = dirname(dirname(matlab_exe))
else
if Sys.isapple()
default_dir = "/Applications"
if isdir(default_dir)
dirs = readdir(default_dir)
filter!(app -> occursin(r"^MATLAB_R[0-9]+[ab]\.app$", app), dirs)
if !isempty(dirs)
matlab_root = joinpath(default_dir, maximum(dirs))
end
end
elseif Sys.iswindows()
default_dir = Sys.WORD_SIZE == 32 ? "C:\\Program Files (x86)\\MATLAB" : "C:\\Program Files\\MATLAB"
if isdir(default_dir)
dirs = readdir(default_dir)
filter!(dir -> occursin(r"^R[0-9]+[ab]$", dir), dirs)
if !isempty(dirs)
matlab_root = joinpath(default_dir, maximum(dirs))
end
end
elseif Sys.islinux()
default_dir = "/usr/local/MATLAB"
if isdir(default_dir)
dirs = readdir(default_dir)
filter!(dir -> occursin(r"^R[0-9]+[ab]$", dir), dirs)
if !isempty(dirs)
matlab_root = joinpath(default_dir, maximum(dirs))
end
end
end
end
end
!isnothing(matlab_root) && isdir(matlab_root) && @info("Detected MATLAB root folder at \"$matlab_root\"")
return matlab_root
end

function find_matlab_libpath(matlab_root)
# get path to MATLAB libraries
matlab_libdir = if Sys.islinux()
Sys.WORD_SIZE == 32 ? "glnx86" : "glnxa64"
elseif Sys.isapple()
Sys.WORD_SIZE == 32 ? "maci" : "maci64"
elseif Sys.iswindows()
Sys.WORD_SIZE == 32 ? "win32" : "win64"
end
matlab_libpath = joinpath(matlab_root, "bin", matlab_libdir)
isdir(matlab_libpath) && @info("Detected MATLAB library path at \"$matlab_libpath\"")
return matlab_libpath
end

function find_matlab_cmd(matlab_root)
if Sys.iswindows()
matlab_cmd = joinpath(matlab_root, "bin", (Sys.WORD_SIZE == 32 ? "win32" : "win64"), "matlab.exe")
isfile(matlab_cmd) && @info("Detected MATLAB executable at \"$matlab_cmd\"")
else
matlab_exe = joinpath(matlab_root, "bin", "matlab")
isfile(matlab_exe) && @info("Detected MATLAB executable at \"$matlab_exe\"")
matlab_cmd = "exec $(Base.shell_escape(matlab_exe))"
end
return matlab_cmd
end

matlab_root = find_matlab_root()

if !isnothing(matlab_root)
matlab_libpath = find_matlab_libpath(matlab_root)
matlab_cmd = find_matlab_cmd(matlab_root)
libmx_size = filesize(Libdl.dlpath(joinpath(matlab_libpath, "libmx")))
open(depsfile, "w") do io
println(io,
"""
# This file is automatically generated, do not edit.
function check_deps()
if libmx_size != filesize(Libdl.dlpath(joinpath(matlab_libpath, "libmx")))
error("MATLAB library has changed, re-run Pkg.build(\\\"MATLAB\\\")")
end
end
"""
)
println(io, "const matlab_libpath = \"$(escape_string(matlab_libpath))\"")
println(io, "const matlab_cmd = \"$(escape_string(matlab_cmd))\"")
println(io, "const libmx_size = $libmx_size")
end
elseif get(ENV, "JULIA_REGISTRYCI_AUTOMERGE", nothing) == "true" || get(ENV, "CI", nothing) == "true"
# We need to be able to install and load this package without error for
# Julia's registry AutoMerge to work, so we just use dummy values.
# Similarly we want to also be able to install and load this package for CI.
matlab_libpath = ""
matlab_cmd = ""
libmx_size = 0

open(depsfile, "w") do io
println(io,
"""
# This file is automatically generated, do not edit.
check_deps() = nothing
"""
)
println(io, "const matlab_libpath = \"$(escape_string(matlab_libpath))\"")
println(io, "const matlab_cmd = \"$(escape_string(matlab_cmd))\"")
println(io, "const libmx_size = $libmx_size")
end
else
error("MATLAB cannot be found. Set the \"MATLAB_ROOT\" environment variable to the MATLAB root directory and re-run Pkg.build(\"MATLAB\").")
end

0 comments on commit c732f7d

Please sign in to comment.