|
1 | 1 | module Precompilation
|
2 | 2 |
|
3 |
| -using Base: PkgId, UUID, SHA1, parsed_toml, project_file_name_uuid, project_names, |
| 3 | +using Base: CoreLogging, PkgId, UUID, SHA1, parsed_toml, project_file_name_uuid, project_names, |
4 | 4 | project_file_manifest_path, get_deps, preferences_names, isaccessibledir, isfile_casesensitive,
|
5 | 5 | base_project, isdefined
|
6 | 6 |
|
@@ -532,9 +532,16 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
532 | 532 | num_tasks = parse(Int, get(ENV, "JULIA_NUM_PRECOMPILE_TASKS", string(default_num_tasks)))
|
533 | 533 | parallel_limiter = Base.Semaphore(num_tasks)
|
534 | 534 |
|
535 |
| - # suppress passive loading printing in julia test suite. `JULIA_TESTS` is set in Base.runtests |
536 |
| - io = (_from_loading && !Sys.isinteractive() && Base.get_bool_env("JULIA_TESTS", false)) ? IOContext{IO}(devnull) : _io |
537 |
| - |
| 535 | + # suppress precompilation progress messages when precompiling for loading packages, except during interactive sessions |
| 536 | + # or when specified by logging heuristics that explicitly require it |
| 537 | + # since the complicated IO implemented here can have somewhat disastrous consequences when happening in the background (e.g. #59599) |
| 538 | + io = _io |
| 539 | + logcalls = nothing |
| 540 | + if _from_loading && !isinteractive() |
| 541 | + io = IOContext{IO}(devnull) |
| 542 | + fancyprint = false |
| 543 | + logcalls = isinteractive() ? CoreLogging.Info : CoreLogging.Debug # sync with Base.compilecache |
| 544 | + end |
538 | 545 |
|
539 | 546 | nconfigs = length(configs)
|
540 | 547 | hascolor = get(io, :color, false)::Bool
|
@@ -608,8 +615,6 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
608 | 615 | # consider exts of project deps to be project deps so that errors are reported
|
609 | 616 | append!(project_deps, keys(filter(d->last(d).name in keys(env.project_deps), ext_to_parent)))
|
610 | 617 |
|
611 |
| - @debug "precompile: deps collected" |
612 |
| - |
613 | 618 | # An extension effectively depends on another extension if it has a strict superset of its triggers
|
614 | 619 | for ext_a in keys(ext_to_parent)
|
615 | 620 | for ext_b in keys(ext_to_parent)
|
@@ -664,7 +669,6 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
664 | 669 | end
|
665 | 670 | end
|
666 | 671 | end
|
667 |
| - @debug "precompile: extensions collected" |
668 | 672 |
|
669 | 673 | serial_deps = Base.PkgId[] # packages that are being precompiled in serial
|
670 | 674 |
|
@@ -704,7 +708,6 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
704 | 708 | was_recompiled[pkg_config] = false
|
705 | 709 | end
|
706 | 710 | end
|
707 |
| - @debug "precompile: signalling initialized" |
708 | 711 |
|
709 | 712 | # find and guard against circular deps
|
710 | 713 | cycles = Vector{Base.PkgId}[]
|
@@ -732,7 +735,6 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
732 | 735 | if !isempty(circular_deps)
|
733 | 736 | @warn excluded_circular_deps_explanation(io, ext_to_parent, circular_deps, cycles)
|
734 | 737 | end
|
735 |
| - @debug "precompile: circular dep check done" |
736 | 738 |
|
737 | 739 | # If you have a workspace and want to precompile all projects in it, look through all packages in the manifest
|
738 | 740 | # instead of collecting from a project i.e. not filter out packages that are in the current project.
|
@@ -785,7 +787,6 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
785 | 787 | else
|
786 | 788 | target[] = "for $nconfigs compilation configurations..."
|
787 | 789 | end
|
788 |
| - @debug "precompile: packages filtered" |
789 | 790 |
|
790 | 791 | pkg_queue = PkgConfig[]
|
791 | 792 | failed_deps = Dict{PkgConfig, String}()
|
@@ -1013,16 +1014,23 @@ function _precompilepkgs(pkgs::Union{Vector{String}, Vector{PkgId}},
|
1013 | 1014 | return
|
1014 | 1015 | end
|
1015 | 1016 | try
|
1016 |
| - # allows processes to wait if another process is precompiling a given package to |
1017 |
| - # a functionally identical package cache (except for preferences, which may differ) |
1018 |
| - t = @elapsed ret = precompile_pkgs_maybe_cachefile_lock(io, print_lock, fancyprint, pkg_config, pkgspidlocked, hascolor, parallel_limiter, ignore_loaded) do |
1019 |
| - Base.with_logger(Base.NullLogger()) do |
1020 |
| - # whether to respect already loaded dependency versions |
1021 |
| - keep_loaded_modules = !ignore_loaded |
1022 |
| - # for extensions, any extension in our direct dependencies is one we have a right to load |
1023 |
| - # for packages, we may load any extension (all possible triggers are accounted for above) |
1024 |
| - loadable_exts = haskey(ext_to_parent, pkg) ? filter((dep)->haskey(ext_to_parent, dep), direct_deps[pkg]) : nothing |
1025 |
| - Base.compilecache(pkg, sourcepath, std_pipe, std_pipe, keep_loaded_modules; |
| 1017 | + # for extensions, any extension in our direct dependencies is one we have a right to load |
| 1018 | + # for packages, we may load any extension (all possible triggers are accounted for above) |
| 1019 | + loadable_exts = haskey(ext_to_parent, pkg) ? filter((dep)->haskey(ext_to_parent, dep), direct_deps[pkg]) : nothing |
| 1020 | + if _from_loading && pkg in requested_pkgids |
| 1021 | + # loading already took the cachefile_lock and printed logmsg for its explicit requests |
| 1022 | + t = @elapsed ret = begin |
| 1023 | + Base.compilecache(pkg, sourcepath, std_pipe, std_pipe, !ignore_loaded; |
| 1024 | + flags, cacheflags, loadable_exts) |
| 1025 | + end |
| 1026 | + else |
| 1027 | + # allows processes to wait if another process is precompiling a given package to |
| 1028 | + # a functionally identical package cache (except for preferences, which may differ) |
| 1029 | + t = @elapsed ret = precompile_pkgs_maybe_cachefile_lock(io, print_lock, fancyprint, pkg_config, pkgspidlocked, hascolor, parallel_limiter, ignore_loaded) do |
| 1030 | + logcalls === nothing || @lock print_lock begin |
| 1031 | + Base.@logmsg logcalls "Precompiling $(repr("text/plain", pkg))" |
| 1032 | + end |
| 1033 | + Base.compilecache(pkg, sourcepath, std_pipe, std_pipe, !ignore_loaded; |
1026 | 1034 | flags, cacheflags, loadable_exts)
|
1027 | 1035 | end
|
1028 | 1036 | end
|
|
0 commit comments