Skip to content

Commit

Permalink
move complex ldconfig code into dependency build time
Browse files Browse the repository at this point in the history
this is in preparation for base Julia to drop this function
  • Loading branch information
vtjnash committed Jun 8, 2017
1 parent 060ee87 commit 26d7514
Showing 1 changed file with 69 additions and 13 deletions.
82 changes: 69 additions & 13 deletions src/dependencies.jl
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ function available_version(y::Yum)
found_uname = false
found_version = false
for l in eachline(`yum info $(y.package)`)
l = chomp(l)
VERSION < v"0.6" && (l = chomp(l))
if !found_uname
# On 64-bit systems, we may have multiple arches installed
# this makes sure we get the right one
Expand Down Expand Up @@ -208,7 +208,7 @@ function available_version(z::Zypper)
ENV2 = copy(ENV)
ENV2["LC_ALL"] = "C"
for l in eachline(setenv(`zypper info $(z.package)`, ENV2))
l = chomp(l)
VERSION < v"0.6" && (l = chomp(l))
if !found_uname
found_uname = endswith(l, uname)
continue
Expand Down Expand Up @@ -358,6 +358,64 @@ end

sudoname(c::Cmd) = c == `` ? "" : "sudo "

const have_sonames = Ref(false)
const sonames = Dict{String,String}()
reread_sonames() = (empty!(sonames); have_sonames[] = false; nothing)

if is_windows() || is_apple()
function read_sonames()
have_sonames[] = true
end
elseif is_linux()
let ldconfig_arch = Dict(:i386 => "x32",
:i387 => "x32",
:i486 => "x32",
:i586 => "x32",
:i686 => "x32",
:x86_64 => "x86-64",
:aarch64 => "AArch64"),
arch = get(ldconfig_arch, Sys.ARCH, ""),
arch_wrong = filter!(x -> (x != arch), ["x32", "x86-64", "AArch64", "soft-float"])
global read_sonames
function read_sonames()
empty!(sonames)
for line in eachline(`/sbin/ldconfig -p`)
VERSION < v"0.6" && (line = chomp(line))
m = match(r"^\s+([^ ]+)\.so[^ ]* \(([^)]*)\) => (.+)$", line)
if m !== nothing
desc = m[2]
if Sys.WORD_SIZE != 32 && !isempty(arch)
contains(desc, arch) || continue
end
for wrong in arch_wrong
contains(desc, wrong) && continue
end
sonames[m[1]] = m[3]
end
end
have_sonames[] = true
end
end
else
function read_sonames()
empty!(sonames)
for line in eachline(`/sbin/ldconfig -r`)
VERSION < v"0.6" && (line = chomp(line))
m = match(r"^\s+\d+:-l([^ ]+)\.[^. ]+ => (.+)$", line)
if m !== nothing
sonames["lib" * m[1]] = m[2]
end
end
have_sonames[] = true
end
end

lookup_soname(s) = lookup_soname(String(s))
function lookup_soname(s::String)
have_sonames[] || read_sonames()
return get(sonames, s, "")
end

generate_steps(h::DependencyProvider,dep::LibraryDependency) = error("Must also pass provider options")
generate_steps(h::BuildProcess,dep::LibraryDependency,opts) = h.steps
function generate_steps(dep::LibraryDependency,h::AptGet,opts)
Expand All @@ -369,7 +427,7 @@ function generate_steps(dep::LibraryDependency,h::AptGet,opts)
@build_steps begin
println("Installing dependency $(h.package) via `$(sudoname(sudo))apt-get install $(h.package)`:")
`$sudo apt-get install $(h.package)`
()->(ccall(:jl_read_sonames,Void,()))
reread_sonames
end
end
function generate_steps(dep::LibraryDependency,h::Yum,opts)
Expand All @@ -381,7 +439,7 @@ function generate_steps(dep::LibraryDependency,h::Yum,opts)
@build_steps begin
println("Installing dependency $(h.package) via `$(sudoname(sudo))yum install $(h.package)`:")
`$sudo yum install $(h.package)`
()->(ccall(:jl_read_sonames,Void,()))
reread_sonames
end
end
function generate_steps(dep::LibraryDependency,h::Pacman,opts)
Expand All @@ -393,7 +451,7 @@ function generate_steps(dep::LibraryDependency,h::Pacman,opts)
@build_steps begin
println("Installing dependency $(h.package) via `$(sudoname(sudo))pacman -S --needed $(h.package)`:")
`$sudo pacman -S --needed $(h.package)`
()->(ccall(:jl_read_sonames,Void,()))
reread_sonames
end
end
function generate_steps(dep::LibraryDependency,h::Zypper,opts)
Expand All @@ -405,7 +463,7 @@ function generate_steps(dep::LibraryDependency,h::Zypper,opts)
@build_steps begin
println("Installing dependency $(h.package) via `$(sudoname(sudo))zypper install $(h.package)`:")
`$sudo zypper install $(h.package)`
()->(ccall(:jl_read_sonames,Void,()))
reread_sonames
end
end
function generate_steps(dep::LibraryDependency, p::BSDPkg, opts)
Expand All @@ -417,7 +475,7 @@ function generate_steps(dep::LibraryDependency, p::BSDPkg, opts)
@build_steps begin
println("Installing dependency $(p.package) via `$(sudoname(sudo))pkg install -y $(p.package)`:`")
`$sudo pkg install -y $(p.package)`
()->(ccall(:jl_read_sonames, Void, ()))
reread_sonames
end
end
function generate_steps(dep::LibraryDependency,h::NetworkSource,opts)
Expand Down Expand Up @@ -622,10 +680,8 @@ function _find_library(dep::LibraryDependency; provider = Any)
opath = string(lib,ext)
check_path!(ret,dep,opath)
end
@static if is_linux() || (is_bsd() && !is_apple())
soname = ccall(:jl_lookup_soname, Ptr{UInt8}, (Ptr{UInt8}, Csize_t), lib, sizeof(lib))
soname != C_NULL && check_path!(ret,dep,unsafe_string(soname))
end
soname = lookup_soname(lib)
isempty(soname) || check_path!(ret, dep, soname)
end
return ret
end
Expand Down Expand Up @@ -1101,8 +1157,8 @@ using SHA
function sha_check(path, sha)
open(path) do f
calc_sha = sha256(f)
# Workaround for SHA.jl API change. Safe to remove once SHA versions
# < v0.2.0 are rare, e.g. when Julia v0.4 is deprecated.
# Workaround for SHA.jl API change. Safe to remove once SHA versions
# < v0.2.0 are rare, e.g. when Julia v0.4 is deprecated.
if !isa(calc_sha, AbstractString)
calc_sha = bytes2hex(calc_sha)
end
Expand Down

0 comments on commit 26d7514

Please sign in to comment.