Skip to content

Commit

Permalink
Update for 1.6 linking and handle stdlibs that aren't in the sysimage (
Browse files Browse the repository at this point in the history
…#471)

* differentiate stdlibs in sysimage from those that aren't

* link to julia-internal on 1.6

* guard a bit more 1.6 code

* fix STLIB path on windows
  • Loading branch information
IanButterworth authored Dec 9, 2020
1 parent 734d9b7 commit 15a6268
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 21 deletions.
67 changes: 53 additions & 14 deletions src/PackageCompiler.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ end
current_process_sysimage_path() = unsafe_string(Base.JLOptions().image_file)

all_stdlibs() = readdir(Sys.STDLIB)
@static if VERSION >= v"1.6.0-DEV.1673"
sysimage_modules() = map(x->x.name, Base._sysimage_modules)
else
sysimage_modules() = all_stdlibs()
end
stdlibs_in_sysimage() = intersect(all_stdlibs(), sysimage_modules())
stdlibs_not_in_sysimage() = setdiff(all_stdlibs(), sysimage_modules())


yesno(b::Bool) = b ? "yes" : "no"

Expand Down Expand Up @@ -239,6 +247,7 @@ function create_sysimg_object_file(object_file::String, packages::Vector{String}
julia_code = """
Base.reinit_stdio()
@eval Sys BINDIR = ccall(:jl_get_julia_bindir, Any, ())::String
@eval Sys STDLIB = $(repr(abspath(Sys.BINDIR, "../share/julia/stdlib", string('v', VERSION.major, '.', VERSION.minor))))
Base.init_load_path()
if isdefined(Base, :init_active_project)
Base.init_active_project()
Expand Down Expand Up @@ -307,14 +316,18 @@ backup_default_sysimg_name() = basename(backup_default_sysimg_path())
gather_stdlibs_project(project::String) = gather_stdlibs_project(create_pkg_context(project))
function gather_stdlibs_project(ctx)
@assert ctx.env.manifest !== nothing
stdlibs = all_stdlibs()
stdlibs_project = String[]
sysimage_stdlibs = stdlibs_in_sysimage()
non_sysimage_stdlibs = stdlibs_not_in_sysimage()
sysimage_stdlibs_project = String[]
non_sysimage_stdlibs_project = String[]
for (uuid, pkg) in ctx.env.manifest
if pkg.name in stdlibs
push!(stdlibs_project, pkg.name)
if pkg.name in sysimage_stdlibs
push!(sysimage_stdlibs_project, pkg.name)
elseif pkg.name in non_sysimage_stdlibs
push!(non_sysimage_stdlibs_project, pkg.name)
end
end
return stdlibs_project
return sysimage_stdlibs_project, non_sysimage_stdlibs_project
end

function check_packages_in_project(ctx, packages)
Expand Down Expand Up @@ -413,11 +426,12 @@ function create_sysimage(packages::Union{Symbol, Vector{Symbol}}=Symbol[];
error("cannot specify `base_sysimage` when `incremental=false`")
end
if filter_stdlibs
stdlibs = gather_stdlibs_project(ctx)
sysimage_stdlibs, non_sysimage_stdlibs = gather_stdlibs_project(ctx)
else
stdlibs= all_stdlibs()
sysimage_stdlibs = stdlibs_in_sysimage()
non_sysimage_stdlibs = stdlibs_not_in_sysimage()
end
base_sysimage = create_fresh_base_sysimage(stdlibs; cpu_target=cpu_target)
base_sysimage = create_fresh_base_sysimage(sysimage_stdlibs; cpu_target=cpu_target)
else
if base_sysimage == nothing
base_sysimage = current_process_sysimage_path()
Expand Down Expand Up @@ -463,7 +477,22 @@ function create_sysimg_from_object_file(input_object::String, sysimage_path::Str
extra = Sys.iswindows() ? `-Wl,--export-all-symbols` : ``
compiler = get_compiler()
m = something(march(), ``)
cmd = `$compiler $(bitflag()) $m -shared -L$(julia_libdir) -o $sysimage_path $o_file -ljulia $extra`
cmd = if VERSION >= v"1.6.0-DEV.1673"
private_libdir = if Base.DARWIN_FRAMEWORK # taken from Libdl tests
if ccall(:jl_is_debugbuild, Cint, ()) != 0
dirname(abspath(Libdl.dlpath(Base.DARWIN_FRAMEWORK_NAME * "_debug")))
else
joinpath(dirname(abspath(Libdl.dlpath(Base.DARWIN_FRAMEWORK_NAME))),"Frameworks")
end
elseif ccall(:jl_is_debugbuild, Cint, ()) != 0
dirname(abspath(Libdl.dlpath("libjulia-internal-debug")))
else
dirname(abspath(Libdl.dlpath("libjulia-internal")))
end
`$compiler $(bitflag()) $m -shared -L$(julia_libdir) -L$(private_libdir) -o $sysimage_path $o_file -ljulia-internal -ljulia $extra`
else
`$compiler $(bitflag()) $m -shared -L$(julia_libdir) -o $sysimage_path $o_file -ljulia $extra`
end
@debug "running $cmd"
run_with_env(cmd, compiler)
return nothing
Expand Down Expand Up @@ -668,12 +697,22 @@ function create_executable_from_sysimg(;sysimage_path::String,
flags = join((cflags(), ldflags(), ldlibs()), " ")
flags = Base.shell_split(flags)
wrapper = c_driver_program_path
if Sys.iswindows()
rpath = ``
elseif Sys.isapple()
rpath = `-Wl,-rpath,'@executable_path' -Wl,-rpath,'@executable_path/../lib'`
rpath = if VERSION >= v"1.6.0-DEV.1673"
if Sys.iswindows()
``
elseif Sys.isapple()
`-Wl,-rpath,'@executable_path' -Wl,-rpath,'@executable_path/../lib' -Wl,-rpath,'@executable_path/../lib/julia'`
else
`-Wl,-rpath,\$ORIGIN:\$ORIGIN/../lib -Wl,-rpath,\$ORIGIN:\$ORIGIN/../lib/julia`
end
else
rpath = `-Wl,-rpath,\$ORIGIN:\$ORIGIN/../lib`
if Sys.iswindows()
``
elseif Sys.isapple()
`-Wl,-rpath,'@executable_path' -Wl,-rpath,'@executable_path/../lib'`
else
`-Wl,-rpath,\$ORIGIN:\$ORIGIN/../lib`
end
end
compiler = get_compiler()
m = something(march(), ``)
Expand Down
26 changes: 19 additions & 7 deletions src/juliaconfig.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ end
julia_includedir() = abspath(Sys.BINDIR, Base.INCLUDEDIR, "julia")

function ldflags()
fl = "-L$(shell_escape(julia_libdir()))"
fl = if VERSION >= v"1.6.0-DEV.1673"
"-L$(shell_escape(julia_libdir())) -L$(shell_escape(julia_private_libdir()))"
else
"-L$(shell_escape(julia_libdir()))"
end
if Sys.iswindows()
fl = fl * " -Wl,--stack,8388608"
fl = fl * " -Wl,--export-all-symbols"
Expand All @@ -36,17 +40,25 @@ end

# TODO
function ldlibs(relative_path=nothing)
libname = if ccall(:jl_is_debugbuild, Cint, ()) != 0
"julia-debug"
libnames = if VERSION >= v"1.6.0-DEV.1673"
if ccall(:jl_is_debugbuild, Cint, ()) != 0
"-ljulia-debug -ljulia-debug-internal"
else
"-ljulia -ljulia-internal"
end
else
"julia"
if ccall(:jl_is_debugbuild, Cint, ()) != 0
"-ljulia-debug"
else
"-ljulia"
end
end
if Sys.islinux()
return "-Wl,-rpath-link,$(shell_escape(julia_libdir())) -Wl,-rpath-link,$(shell_escape(julia_private_libdir())) -l$libname"
return "-Wl,-rpath-link,$(shell_escape(julia_libdir())) -Wl,-rpath-link,$(shell_escape(julia_private_libdir())) $libnames"
elseif Sys.iswindows()
return "-l$libname -lopenlibm"
return "$libnames -lopenlibm"
else
return "-l$libname"
return "$libnames"
end
end

Expand Down

0 comments on commit 15a6268

Please sign in to comment.