Skip to content

Commit 442e8d4

Browse files
authored
Add test-JuliaLowering_stdlibs target for precompiling stdlibs with JuliaLowering (#60194)
This adds a new test target: `make test-JuliaLowering_stdlibs`, which precompiles a supported set of standard libraries using JuliaLowering. To accomplish this, it also adds a basic incremental sysimage build target (`julia-sysimg-JL-release` / `julia-sysimg-JL-debug`) that modifies the base sysimage to include JuliaLowering. Currently 38 / 52 pkgimage-based stdlibs can be compiled with JuliaLowering: - Pre-compiling: ArgTools, Future, LibCURL_jll, Logging, OpenSSL_jll, Tar, dSFMT_jll, Base64, GMP_jll, LibGit2_jll, MPFR_jll, PCRE2_jll, UUIDs, libLLVM_jll, CRC32c, LLD_jll, LibSSH2_jll, MozillaCACerts_jll, Printf, Unicode, Mmap, nghttp2_jll, Distributed, LLVMLibUnwind_jll, LibUV_jll, NetworkOptions, Serialization, Zlib_jll, p7zip_jll, LibCURL, LibUnwind_jll, OpenLibm_jll, SuiteSparse_jll, Zstd_jll, Dates, DelimitedFiles, SharedArrays, Downloads - Failing: Statistics, StyledStrings, SparseArrays, SuiteSparse, Profile, JuliaSyntaxHighlighting, Markdown, LibGit2, InteractiveUtils, Test, REPL, TOML, Pkg, LazyArtifacts
1 parent 841148d commit 442e8d4

File tree

6 files changed

+124
-2
lines changed

6 files changed

+124
-2
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ julia-cli-release julia-cli-debug: julia-cli-% : julia-deps
123123
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% | $(build_private_libdir)
124124
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-$*
125125

126+
.PHONY: julia-sysimg-JL-release julia-sysimg-JL-debug
127+
julia-sysimg-JL-release julia-sysimg-JL-debug : julia-sysimg-JL-% : julia-sysimg-% julia-stdlib | $(build_private_libdir)
128+
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-JL-$*
129+
126130
# Useful for cross-bootstrapping
127131
.PHONY: julia-sysbase-release julia-sysbase-debug
128132
julia-sysbase-release julia-sysbase-debug : julia-sysbase-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% | $(build_private_libdir)

base/Base.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,9 @@ a_method_to_overwrite_in_test() = inferencebarrier(1)
319319
Core.println("JuliaSyntax/src/JuliaSyntax.jl")
320320
include(@__MODULE__, string(DATAROOT, "julia/JuliaSyntax/src/JuliaSyntax.jl"))
321321

322+
# May be replaced in incremental sysimage build after-the-fact
323+
const JuliaLowering = nothing
324+
322325
end_base_include = time_ns()
323326

324327
const _sysimage_modules = PkgId[]
@@ -397,6 +400,11 @@ function __init__()
397400
if get_bool_env("JULIA_USE_FLISP_PARSER", false) === false
398401
JuliaSyntax.enable_in_core!()
399402
end
403+
if JuliaLowering !== nothing && get_bool_env("JULIA_USE_FLISP_LOWERING", true) === false
404+
# This is not available by default, but JuliaLowering can be added to
405+
# Base after-the-fact via an incremental sysimage build.
406+
JuliaLowering.activate!()
407+
end
400408

401409
CoreLogging.global_logger(CoreLogging.ConsoleLogger())
402410
nothing

sysimage.mk

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ sysimg-ji: $(build_private_libdir)/sysbase.ji
1111
sysimg-bc: $(build_private_libdir)/sys-bc.a
1212
sysimg-release: $(build_private_libdir)/sys.$(SHLIB_EXT)
1313
sysimg-debug: $(build_private_libdir)/sys-debug.$(SHLIB_EXT)
14+
sysimg-JL-release: $(build_private_libdir)/sys-JL.$(SHLIB_EXT)
15+
sysimg-JL-debug: $(build_private_libdir)/sys-JL-debug.$(SHLIB_EXT)
1416
sysbase-release: $(build_private_libdir)/sysbase.$(SHLIB_EXT)
1517
sysbase-debug: $(build_private_libdir)/sysbase-debug.$(SHLIB_EXT)
1618

@@ -147,7 +149,31 @@ $$(build_private_libdir)/sys$1-o.a $$(build_private_libdir)/sys$1-bc.a : $$(buil
147149
.SECONDARY: $$(build_private_libdir)/sys$1-o.a $(build_private_libdir)/sys$1-bc.a # request Make to keep these files around
148150
.SECONDARY: $$(build_private_libdir)/sysbase$1-o.a $(build_private_libdir)/sysbase$1-bc.a # request Make to keep these files around
149151
endef
152+
153+
JULIALOWERING_SRCS := $(shell find $(build_datarootdir)/julia/JuliaLowering/src -name \*.jl)
154+
155+
define JL_sysimg_builder
156+
$$(build_private_libdir)/sys-JL$1-o.a $$(build_private_libdir)/sys-JL$1-bc.a : $$(build_private_libdir)/sys-JL$1-%.a : $$(build_private_libdir)/sys$1.$$(SHLIB_EXT) $$(JULIALOWERING_SRCS)
157+
@$$(call PRINT_JULIA, cd $$(JULIAHOME)/JuliaLowering/src/ && \
158+
if ! JULIA_BINDIR=$$(call cygpath_w,$(build_bindir)) \
159+
WINEPATH="$$(call cygpath_w,$$(build_bindir));$$$$WINEPATH" \
160+
JULIA_LOAD_PATH='@stdlib' \
161+
JULIA_PROJECT= \
162+
JULIA_DEPOT_PATH=':' \
163+
JULIA_NUM_THREADS=1 \
164+
$$(call spawn, $3) $2 -C "$$(JULIA_CPU_TARGET)" $$(HEAPLIM) --output-$$* $$(call cygpath_w,$$@).tmp $$(JULIA_SYSIMG_BUILD_FLAGS) \
165+
$(bootstrap_julia_flags) \
166+
--startup-file=no --warn-overwrite=yes --depwarn=error --sysimage $$(call cygpath_w,$$<) -e "Core.include(Base, raw\"$$(call cygpath_w,$$(BUILDROOT)/JuliaLowering/src/JuliaLowering.jl)\")"; then \
167+
echo '*** This error is usually fixed by running `make clean`. If the error persists$$(COMMA) try `make cleanall`. ***'; \
168+
false; \
169+
fi )
170+
@mv $$@.tmp $$@
171+
.SECONDARY: $$(build_private_libdir)/sys-JL$1-o.a $(build_private_libdir)/sys-JL$1-bc.a # request Make to keep these files around
172+
endef
173+
150174
$(eval $(call base_builder,,-O1,$(JULIA_EXECUTABLE_release)))
151175
$(eval $(call base_builder,-debug,-O0,$(JULIA_EXECUTABLE_debug)))
152176
$(eval $(call sysimg_builder,,-O3,$(JULIA_EXECUTABLE_release)))
153177
$(eval $(call sysimg_builder,-debug,-O0,$(JULIA_EXECUTABLE_debug)))
178+
$(eval $(call JL_sysimg_builder,,-O3,$(JULIA_EXECUTABLE_release)))
179+
$(eval $(call JL_sysimg_builder,-debug,-O0,$(JULIA_EXECUTABLE_debug)))

test/JuliaLowering_stdlibs.jl

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import Libdl
2+
3+
### 38 / 52 (non-sysimage) stdlibs precompile successfully with JuliaLowering ###
4+
const INCOMPATIBLE_STDLIBS = String[
5+
"Statistics", "JuliaSyntaxHighlighting", "Markdown", "LibGit2",
6+
"InteractiveUtils", "Test", "REPL", "Pkg", "LazyArtifacts", "SparseArrays",
7+
"TOML", "StyledStrings", "Profile", "SuiteSparse",
8+
]
9+
10+
const JULIA_EXECUTABLE = Base.unsafe_string(Base.JLOptions().julia_bin)
11+
const JULIA_CPU_TARGET = get(ENV, "JULIA_CPU_TARGET", Base.unsafe_string(Base.JLOptions().cpu_target))
12+
const debug = get(ENV, "JULIA_BUILD_MODE", "release") == "debug" ? "-debug" : ""
13+
const JL_sysimage = joinpath(dirname(unsafe_string(Base.JLOptions().image_file)), "sys-JL$(debug).$(Libdl.dlext)")
14+
15+
function compile_JL_sysimage(output_filepath)
16+
sysimage = unsafe_string(Base.JLOptions().image_file)
17+
output_sysimage = abspath(output_filepath)
18+
output_object = "$(splitext(output_sysimage)[1])-o.a"
19+
20+
package_root = joinpath(Sys.STDLIB, "..", "..", "JuliaLowering")
21+
cmd = `$(JULIA_EXECUTABLE) -C "$(JULIA_CPU_TARGET)" --output-o $(output_object)
22+
--startup-file=no --warn-overwrite=yes --depwarn=error --sysimage $(sysimage)
23+
-e "Core.include(Base, $(repr(joinpath(package_root, "src", "JuliaLowering.jl"))))"`
24+
cmd = addenv(
25+
Base.Cmd(cmd; dir = joinpath(package_root, "src")),
26+
"JULIA_BINDIR" => unsafe_string(Base.JLOptions().julia_bindir),
27+
"JULIA_LOAD_PATH" => "@stdlib",
28+
"JULIA_PROJECT" => nothing,
29+
"JULIA_DEPOT_PATH" => ":",
30+
"JULIA_NUM_THREADS" => "1",
31+
)
32+
println("Compiling incremental sysimage with JuliaLowering...")
33+
success(run(cmd))
34+
35+
cmd = Base.Linking.link_image_cmd(output_object, output_sysimage)
36+
success(run(cmd))
37+
38+
return nothing
39+
end
40+
41+
# ensure JL-inclusive sysimage is built / available
42+
if "BUILDROOT" in keys(ENV)
43+
# Running via Makefile, use sysimage.mk with its built-in caching / file tracking
44+
run(`$(ENV["MAKE"]) -C $(ENV["BUILDROOT"]) -f sysimage.mk sysimg-JL-$(ENV["JULIA_BUILD_MODE"])`)
45+
else
46+
# Standalone test run (CI), compile every time
47+
compile_JL_sysimage(JL_sysimage)
48+
end
49+
stdlibs_to_test = filter(name -> !in(name, INCOMPATIBLE_STDLIBS), readdir(Sys.STDLIB))
50+
51+
configs = [
52+
``=>Base.CacheFlags(check_bounds=0, debug_level=2, opt_level=3),
53+
``=>Base.CacheFlags(check_bounds=1, debug_level=2, opt_level=3),
54+
]
55+
setupproject_command = "using Pkg; Pkg.add($(stdlibs_to_test))"
56+
compilecache_command = "using Base: CacheFlags; Base.Precompilation.precompilepkgs($(stdlibs_to_test); configs=$(configs))"
57+
58+
# pre-compile stdlibs (into temporary depot)
59+
mktempdir() do tmp_depot
60+
# first setup the project / environment
61+
env_dir = joinpath(tmp_depot, "environments", "v$(VERSION.major).$(VERSION.minor)")
62+
cmd = addenv(
63+
`$(JULIA_EXECUTABLE) --startup-file=no --project=$env_dir -e $setupproject_command`,
64+
; inherit = true
65+
)
66+
success(run(cmd))
67+
68+
# now actually perform the precompilation
69+
cmd = addenv(
70+
`$(JULIA_EXECUTABLE) --sysimage $(JL_sysimage) --startup-file=no -e $compilecache_command`,
71+
"JULIA_LOAD_PATH" => "@stdlib$(Base.Linking.pathsep)$(env_dir)",
72+
"JULIA_CPU_TARGET" => "sysimage",
73+
"JULIA_USE_FLISP_LOWERING" => "0",
74+
"JULIA_USE_FALLBACK_REPL" => "0",
75+
"JULIA_DEPOT_PATH" => tmp_depot,
76+
; inherit = true
77+
)
78+
success(run(cmd))
79+
end

test/Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ export JULIA_LOAD_PATH := @$(PATHSEP)@stdlib
1111
unexport JULIA_PROJECT :=
1212
unexport JULIA_BINDIR :=
1313

14+
# used by JuliaLowering_stdlibs.jl test (invokes `make` for JL sysimage)
15+
export MAKE
16+
export BUILDROOT
17+
export JULIA_BUILD_MODE
18+
1419
TESTGROUPS = unicode strings compiler Compiler JuliaSyntax JuliaLowering
1520
TESTS = all default stdlib $(TESTGROUPS) \
1621
$(patsubst $(STDLIBDIR)/%/,%,$(dir $(wildcard $(STDLIBDIR)/*/.))) \
@@ -33,7 +38,7 @@ default:
3338

3439
.PHONY: $(TESTS)
3540
$(TESTS):
36-
@cd $(SRCDIR) && \
41+
+@cd $(SRCDIR) && \
3742
$(call PRINT_JULIA, $(call spawn,$(JULIA_EXECUTABLE)) $(TEST_JULIA_OPTIONS) ./runtests.jl $(TEST_SCRIPT_OPTIONS) $@)
3843

3944
.PHONY: install-revise-deps

test/choosetests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const TESTNAMES = [
3131
"smallarrayshrink", "opaque_closure", "filesystem", "download",
3232
"scopedvalues", "compileall", "rebinding",
3333
"faulty_constructor_method_should_not_cause_stack_overflows",
34-
"JuliaSyntax", "JuliaLowering",
34+
"JuliaSyntax", "JuliaLowering", "JuliaLowering_stdlibs",
3535
]
3636

3737
const INTERNET_REQUIRED_LIST = [

0 commit comments

Comments
 (0)