Skip to content

Commit 57fbef2

Browse files
committed
Merge branch 'interactive-utils-functors' of github.com:serenity4/julia; branch 'master' of github.com:JuliaLang/julia into interactive-utils-functors
3 parents 5f5db13 + 84dd768 + ecdb4be commit 57fbef2

File tree

282 files changed

+5333
-1987
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

282 files changed

+5333
-1987
lines changed

AGENTS.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,19 @@ will not be reflected, unless you use `Revise`.
1919

2020
## For all changes
2121

22-
1. Run `make check-whitespace` before creating the PR to make sure you're not committing any whitespace errors.
22+
1. Run `make fix-whitespace` before creating the PR to make sure you're not committing any whitespace errors.
2323

2424
## Building Julia
2525

2626
If you made changes to the runtime (any files in `src/`), you will need to rebuild
2727
julia. Run `make -j` to rebuild julia. This process may take up to 10 minutes
2828
depending on your changes.
2929

30+
After `make` run these static analysis checks:
31+
- `make -C src clang-sa-<filename>` (replace `<filename>` with the basename of the file you modified)
32+
- `make -C src clang-sagc-<filename>` which may require adding JL_GC_PUSH arguments, or JL_GC_PROMISE_ROOTED statements., or require fixing locks. Remember arguments are assumed rooted, so check the callers to make sure that is handled. If the value is being temporarily moved around in a struct or arraylist, `JL_GC_PROMISE_ROOTED(struct->field)` may be needed as a statement (it return void) immediately after reloading the struct before any use of struct. Put the promise as early in the code as is legal.
33+
- `make -C src clang-tidy-<filename>`
34+
3035
## Using Revise
3136

3237
If you have made changes to files included in the system image (base/ or stdlib/),
@@ -76,6 +81,13 @@ When modifying external dependencies (patches in `deps/patches/` or version upda
7681
- Prefer using the full upstream commit in `git am` format (e.g., `git format-patch`) which includes proper commit metadata
7782
3. When updating dependency versions, ensure all associated patches still apply
7883

84+
### External JLLs
85+
86+
To update a JLL to the latest version:
87+
- Update the version number in the appropriate jll folder
88+
- If the dependencies in the upstream jll changed, update the Project.toml
89+
- Run `make -f contrib/refresh_checksums.mk <jll>` to update the checksums. This may take a few minutes.
90+
7991
### Writing code
8092
After writing code, look up the docstring for each function you used. If there
8193
are recommendations or additional considerations that apply to these functions,

Compiler/src/abstractinterpretation.jl

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ function find_union_split_method_matches(interp::AbstractInterpreter, argtypes::
369369
end
370370
valid_worlds = intersect(valid_worlds, thismatches.valid_worlds)
371371
thisfullmatch = any(match::MethodMatch->match.fully_covers, thismatches)
372-
mt = Core.GlobalMethods
372+
mt = Core.methodtable
373373
thisinfo = MethodMatchInfo(thismatches, mt, sig_n, thisfullmatch)
374374
push!(infos, thisinfo)
375375
for idx = 1:length(thismatches)
@@ -390,7 +390,7 @@ function find_simple_method_matches(interp::AbstractInterpreter, @nospecialize(a
390390
return FailedMethodMatch("Too many methods matched")
391391
end
392392
fullmatch = any(match::MethodMatch->match.fully_covers, matches)
393-
mt = Core.GlobalMethods
393+
mt = Core.methodtable
394394
info = MethodMatchInfo(matches, mt, atype, fullmatch)
395395
applicable = MethodMatchTarget[MethodMatchTarget(matches[idx], info.edges, idx) for idx = 1:length(matches)]
396396
return MethodMatches(applicable, info, matches.valid_worlds)
@@ -3255,7 +3255,7 @@ function abstract_eval_copyast(interp::AbstractInterpreter, e::Expr, sstate::Sta
32553255
return RTEffects(rt, Any, effects)
32563256
end
32573257

3258-
function abstract_eval_isdefined_expr(interp::AbstractInterpreter, e::Expr, sstate::StatementState,
3258+
function abstract_eval_isdefined_expr(::AbstractInterpreter, e::Expr, sstate::StatementState,
32593259
sv::AbsIntState)
32603260
sym = e.args[1]
32613261
if isa(sym, SlotNumber) && sstate.vtypes !== nothing
@@ -3485,7 +3485,59 @@ function refine_partial_type(@nospecialize t)
34853485
return t
34863486
end
34873487

3488+
abstract_eval_nonlinearized_foreigncall_name(interp::AbstractInterpreter, e, sstate::StatementState, sv::IRInterpretationState) = nothing
3489+
3490+
function abstract_eval_nonlinearized_foreigncall_name(interp::AbstractInterpreter, e, sstate::StatementState, sv::AbsIntState)
3491+
if isexpr(e, :call)
3492+
n = length(e.args)
3493+
argtypes = Vector{Any}(undef, n)
3494+
callresult = Future{CallMeta}()
3495+
i::Int = 1
3496+
nextstate::UInt8 = 0x0
3497+
local ai, res
3498+
function evalargs(interp, sv)
3499+
if nextstate === 0x1
3500+
@goto state1
3501+
elseif nextstate === 0x2
3502+
@goto state2
3503+
end
3504+
while i <= n
3505+
ai = abstract_eval_nonlinearized_foreigncall_name(interp, e.args[i], sstate, sv)
3506+
if !isready(ai)
3507+
nextstate = 0x1
3508+
return false
3509+
@label state1
3510+
end
3511+
argtypes[i] = ai[].rt
3512+
i += 1
3513+
end
3514+
res = abstract_call(interp, ArgInfo(e.args, argtypes), sstate, sv)
3515+
if !isready(res)
3516+
nextstate = 0x2
3517+
return false
3518+
@label state2
3519+
end
3520+
callresult[] = res[]
3521+
return true
3522+
end
3523+
evalargs(interp, sv) || push!(sv.tasks, evalargs)
3524+
return callresult
3525+
else
3526+
return Future(abstract_eval_basic_statement(interp, e, sstate, sv))
3527+
end
3528+
end
3529+
34883530
function abstract_eval_foreigncall(interp::AbstractInterpreter, e::Expr, sstate::StatementState, sv::AbsIntState)
3531+
callee = e.args[1]
3532+
if isexpr(callee, :call) && length(callee.args) > 1 && callee.args[1] == GlobalRef(Core, :tuple)
3533+
# NOTE these expressions are not properly linearized
3534+
abstract_eval_nonlinearized_foreigncall_name(interp, callee.args[2], sstate, sv)
3535+
if length(callee.args) > 2
3536+
abstract_eval_nonlinearized_foreigncall_name(interp, callee.args[3], sstate, sv)
3537+
end
3538+
else
3539+
abstract_eval_value(interp, callee, sstate, sv)
3540+
end
34893541
mi = frame_instance(sv)
34903542
t = sp_type_rewrap(e.args[2], mi, true)
34913543
for i = 3:length(e.args)
@@ -4414,7 +4466,7 @@ function conditional_change(𝕃ᵢ::AbstractLattice, currstate::VarTable, condt
44144466
# "causes" since we ignored those in the comparison
44154467
newtyp = tmerge(𝕃ᵢ, newtyp, LimitedAccuracy(Bottom, oldtyp.causes))
44164468
end
4417-
# if this `Conditional` is from from `@isdefined condt.slot`, refine its `undef` information
4469+
# if this `Conditional` is from `@isdefined condt.slot`, refine its `undef` information
44184470
newundef = condt.isdefined ? !then_or_else : vtype.undef
44194471
return StateUpdate(SlotNumber(condt.slot), VarState(newtyp, newundef), #=conditional=#true)
44204472
end

Compiler/src/optimize.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,9 @@ function iscall_with_boundscheck(@nospecialize(stmt), sv::PostOptAnalysisState)
720720
f === nothing && return false
721721
if f === getfield
722722
nargs = 4
723-
elseif f === memoryrefnew || f === memoryrefget || f === memoryref_isassigned
723+
elseif f === memoryrefnew
724+
nargs= 3
725+
elseif f === memoryrefget || f === memoryref_isassigned
724726
nargs = 4
725727
elseif f === memoryrefset!
726728
nargs = 5

Compiler/src/stmtinfo.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ function _add_edges_impl(edges::Vector{Any}, info::MethodMatchInfo, mi_edge::Boo
4949
if !fully_covering(info)
5050
exists = false
5151
for i in 2:length(edges)
52-
if edges[i] === Core.GlobalMethods && edges[i-1] == info.atype
52+
if edges[i] === Core.methodtable && edges[i-1] == info.atype
5353
exists = true
5454
break
5555
end
5656
end
5757
if !exists
5858
push!(edges, info.atype)
59-
push!(edges, Core.GlobalMethods)
59+
push!(edges, Core.methodtable)
6060
end
6161
end
6262
nmatches = length(info.results)

Compiler/src/tfuncs.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,7 @@ end
20962096
@nospecs function memoryref_tfunc(𝕃::AbstractLattice, ref, idx, boundscheck)
20972097
memoryref_builtin_common_errorcheck(ref, Const(:not_atomic), boundscheck) || return Bottom
20982098
hasintersect(widenconst(idx), Int) || return Bottom
2099+
hasintersect(widenconst(ref), GenericMemory) && return memoryref_tfunc(𝕃, ref)
20992100
return ref
21002101
end
21012102
add_tfunc(memoryrefnew, 1, 3, memoryref_tfunc, 1)
@@ -2107,7 +2108,7 @@ end
21072108
add_tfunc(memoryrefoffset, 1, 1, memoryrefoffset_tfunc, 5)
21082109

21092110
@nospecs function memoryref_builtin_common_errorcheck(mem, order, boundscheck)
2110-
hasintersect(widenconst(mem), GenericMemoryRef) || return false
2111+
hasintersect(widenconst(mem), Union{GenericMemory, GenericMemoryRef}) || return false
21112112
hasintersect(widenconst(order), Symbol) || return false
21122113
hasintersect(widenconst(unwrapva(boundscheck)), Bool) || return false
21132114
return true
@@ -2203,7 +2204,7 @@ function memoryref_builtin_common_nothrow(argtypes::Vector{Any})
22032204
idx = widenconst(argtypes[2])
22042205
idx Int || return false
22052206
boundscheck Bool || return false
2206-
memtype GenericMemoryRef || return false
2207+
memtype Union{GenericMemory, GenericMemoryRef} || return false
22072208
# If we have @inbounds (last argument is false), we're allowed to assume
22082209
# we don't throw bounds errors.
22092210
if isa(boundscheck, Const)
@@ -3207,7 +3208,7 @@ function _hasmethod_tfunc(interp::AbstractInterpreter, argtypes::Vector{Any}, sv
32073208
if match === nothing
32083209
rt = Const(false)
32093210
vresults = MethodLookupResult(Any[], valid_worlds, true)
3210-
mt = Core.GlobalMethods
3211+
mt = Core.methodtable
32113212
vinfo = MethodMatchInfo(vresults, mt, types, false) # XXX: this should actually be an info with invoke-type edge
32123213
else
32133214
rt = Const(true)

Compiler/src/typelattice.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@
88
# inside the global code cache.
99
import Core: Const, InterConditional, PartialStruct
1010

11+
function may_form_limited_typ(@nospecialize(aty), @nospecialize(bty), @nospecialize(xty))
12+
if aty isa LimitedAccuracy
13+
if bty isa LimitedAccuracy
14+
return LimitedAccuracy(xty, union!(copy(aty.causes), bty.causes))
15+
else
16+
return LimitedAccuracy(xty, copy(aty.causes))
17+
end
18+
elseif bty isa LimitedAccuracy
19+
return LimitedAccuracy(xty, copy(bty.causes))
20+
end
21+
return nothing
22+
end
23+
1124
"""
1225
cnd::Conditional
1326
@@ -40,6 +53,8 @@ struct Conditional
4053
isdefined::Bool=false)
4154
assert_nested_slotwrapper(thentype)
4255
assert_nested_slotwrapper(elsetype)
56+
limited = may_form_limited_typ(thentype, elsetype, Bool)
57+
limited !== nothing && return limited
4358
return new(slot, thentype, elsetype, isdefined)
4459
end
4560
end
@@ -83,6 +98,8 @@ struct MustAlias
8398
assert_nested_slotwrapper(fldtyp)
8499
# @assert !isalreadyconst(vartyp) "vartyp is already const"
85100
# @assert !isalreadyconst(fldtyp) "fldtyp is already const"
101+
limited = may_form_limited_typ(vartyp, fldtyp, fldtyp)
102+
limited !== nothing && return limited
86103
return new(slot, vartyp, fldidx, fldtyp)
87104
end
88105
end
@@ -104,6 +121,8 @@ struct InterMustAlias
104121
assert_nested_slotwrapper(fldtyp)
105122
# @assert !isalreadyconst(vartyp) "vartyp is already const"
106123
# @assert !isalreadyconst(fldtyp) "fldtyp is already const"
124+
limited = may_form_limited_typ(vartyp, fldtyp, fldtyp)
125+
limited !== nothing && return limited
107126
return new(slot, vartyp, fldidx, fldtyp)
108127
end
109128
end

Compiler/test/inference.jl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,9 +1597,12 @@ let memoryref_tfunc(@nospecialize xs...) = Compiler.memoryref_tfunc(Compiler.fal
15971597
@test memoryref_tfunc(MemoryRef{Int}, Int, Symbol) == Union{}
15981598
@test memoryref_tfunc(MemoryRef{Int}, Int, Bool) == MemoryRef{Int}
15991599
@test memoryref_tfunc(MemoryRef{Int}, Int, Vararg{Bool}) == MemoryRef{Int}
1600-
@test memoryref_tfunc(Memory{Int}, Int) == Union{}
1601-
@test memoryref_tfunc(Any, Any, Any) == Any # also probably could be GenericMemoryRef
1602-
@test memoryref_tfunc(Any, Any) == Any # also probably could be GenericMemoryRef
1600+
@test memoryref_tfunc(Memory{Int}, Int) == MemoryRef{Int}
1601+
@test memoryref_tfunc(Memory{Int}, Int, Symbol) == Union{}
1602+
@test memoryref_tfunc(Memory{Int}, Int, Bool) == MemoryRef{Int}
1603+
@test memoryref_tfunc(Memory{Int}, Int, Vararg{Bool}) == MemoryRef{Int}
1604+
@test memoryref_tfunc(Any, Any, Any) == GenericMemoryRef
1605+
@test memoryref_tfunc(Any, Any) == GenericMemoryRef
16031606
@test memoryref_tfunc(Any) == GenericMemoryRef
16041607
@test memoryrefget_tfunc(MemoryRef{Int}, Symbol, Bool) === Int
16051608
@test memoryrefget_tfunc(MemoryRef{Int}, Any, Any) === Int
@@ -3546,8 +3549,14 @@ f31974(n::Int) = f31974(1:n)
35463549
# call cycles.
35473550
@test code_typed(f31974, Tuple{Int}) !== nothing
35483551

3549-
f_overly_abstract_complex() = Complex(Ref{Number}(1)[])
3550-
@test Base.return_types(f_overly_abstract_complex, Tuple{}) == [Complex]
3552+
# Issue #33472
3553+
struct WrapperWithUnionall33472{T<:Real}
3554+
x::T
3555+
end
3556+
3557+
f_overly_abstract33472() = WrapperWithUnionall33472(Base.inferencebarrier(1)::Number)
3558+
# Check that this doesn't infer as `WrapperWithUnionall33472{T<:Number}`.
3559+
@test Base.return_types(f_overly_abstract33472, Tuple{}) == [WrapperWithUnionall33472]
35513560

35523561
# Issue 26724
35533562
const IntRange = AbstractUnitRange{<:Integer}

Make.inc

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,10 @@ export PKG_CONFIG_PATH = $(JULIAHOME)/usr/lib/pkgconfig
431431
export PKG_CONFIG_LIBDIR = $(JULIAHOME)/usr/lib/pkgconfig
432432

433433
# Figure out OS and architecture
434-
BUILD_OS := $(shell uname)
434+
RAW_BUILD_OS = $(shell uname)
435+
BUILD_OS := $(RAW_BUILD_OS)
435436

436-
ifneq (,$(findstring CYGWIN,$(BUILD_OS)))
437+
ifneq (,$(findstring CYGWIN,$(RAW_BUILD_OS)))
437438
XC_HOST ?= $(shell uname -m)-w64-mingw32
438439
endif
439440

@@ -561,7 +562,7 @@ JCPPFLAGS_COMMON := -fasynchronous-unwind-tables
561562
JCPPFLAGS_CLANG := $(JCPPFLAGS_COMMON) -mllvm -enable-tail-merge=0
562563
JCPPFLAGS_GCC := $(JCPPFLAGS_COMMON) -fno-tree-tail-merge
563564

564-
JCXXFLAGS_COMMON := -pipe $(fPIC) -fno-rtti -std=c++17 -Wformat -Wformat-security
565+
JCXXFLAGS_COMMON := -pipe $(fPIC) -fno-rtti -std=c++17 -Wformat -Wformat-security -fno-strict-aliasing
565566
JCXXFLAGS_CLANG := $(JCXXFLAGS_COMMON) -pedantic
566567
JCXXFLAGS_GCC := $(JCXXFLAGS_COMMON) -fno-gnu-unique
567568

@@ -797,6 +798,8 @@ ifneq ($(OS), Darwin)
797798
endif
798799
endif
799800

801+
bootstrap_julia_flags :=
802+
800803
ifeq ($(SANITIZE),1)
801804
SANITIZE_OPTS :=
802805
SANITIZE_LDFLAGS :=
@@ -814,6 +817,9 @@ endif
814817
ifeq ($(SANITIZE_THREAD),1)
815818
SANITIZE_OPTS += -fsanitize=thread
816819
SANITIZE_LDFLAGS += -fsanitize=thread
820+
ifneq ($(CROSS_BOOTSTRAP_JULIA),)
821+
bootstrap_julia_flags += --target-sanitize=thread
822+
endif
817823
endif
818824
ifeq ($(SANITIZE_OPTS),)
819825
$(error SANITIZE=1, but no sanitizer selected, set either SANITIZE_MEMORY, SANITIZE_THREAD, or SANITIZE_ADDRESS)
@@ -1579,7 +1585,9 @@ ifeq ($(OS), WINNT)
15791585
HAVE_SSP := 1
15801586
OSLIBS += -Wl,--export-all-symbols -Wl,--version-script=$(BUILDROOT)/src/julia.expmap \
15811587
$(NO_WHOLE_ARCHIVE) -lpsapi -lkernel32 -lws2_32 -liphlpapi -lwinmm -ldbghelp -luserenv -lsecur32 -latomic -lole32
1582-
JLDFLAGS += -Wl,--stack,8388608 --disable-auto-import --disable-runtime-pseudo-reloc
1588+
# N.B.: Unlike in the sysimage, we cannot -Wl,--disable-auto-import -Wl,--disable-runtime-pseudo-reloc here, because libstdc++/LLVM are not fully correct under
1589+
# enforced visibility at this point.
1590+
JLDFLAGS += -Wl,--stack,8388608
15831591
ifeq ($(ARCH),i686)
15841592
JLDFLAGS += -Wl,--large-address-aware
15851593
endif
@@ -1758,9 +1766,15 @@ JULIA_BUILD_MODE := debug
17581766
endif
17591767
endif
17601768

1769+
ifneq ($(CROSS_BOOTSTRAP_JULIA),)
1770+
JULIA_EXECUTABLE_debug := $(CROSS_BOOTSTRAP_JULIA)
1771+
JULIA_EXECUTABLE_release := $(CROSS_BOOTSTRAP_JULIA)
1772+
JULIA_EXECUTABLE := $(CROSS_BOOTSTRAP_JULIA)
1773+
else
17611774
JULIA_EXECUTABLE_debug := $(build_bindir)/julia-debug$(EXE)
17621775
JULIA_EXECUTABLE_release := $(build_bindir)/julia$(EXE)
17631776
JULIA_EXECUTABLE := $(JULIA_EXECUTABLE_$(JULIA_BUILD_MODE))
1777+
endif
17641778

17651779
JULIA_SYSIMG_debug := $(build_private_libdir)/sys-debug.$(SHLIB_EXT)
17661780
JULIA_SYSIMG_release := $(build_private_libdir)/sys.$(SHLIB_EXT)

Makefile

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ julia-deps: | $(DIRS) $(build_datarootdir)/julia/base $(build_datarootdir)/julia
8989
julia-stdlib: | $(DIRS) julia-deps
9090
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/stdlib
9191

92-
julia-base: julia-deps $(build_sysconfdir)/julia/startup.jl $(build_man1dir)/julia.1 $(build_datarootdir)/julia/julia-config.jl $(build_datarootdir)/julia/juliac/juliac.jl $(build_datarootdir)/julia/juliac/juliac-buildscript.jl $(build_datarootdir)/julia/juliac/juliac-trim-base.jl $(build_datarootdir)/julia/juliac/juliac-trim-stdlib.jl
92+
julia-base: julia-deps $(build_sysconfdir)/julia/startup.jl $(build_man1dir)/julia.1 $(build_datarootdir)/julia/julia-config.jl $(build_datarootdir)/julia/juliac/juliac.jl $(build_datarootdir)/julia/juliac/juliac-buildscript.jl $(build_datarootdir)/julia/juliac/juliac-trim-base.jl $(build_datarootdir)/julia/juliac/juliac-trim-stdlib.jl $(build_datarootdir)/julia/juliac/Artifacts.toml
9393
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/base
9494

9595
julia-libccalltest: julia-deps
@@ -110,9 +110,13 @@ julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.in
110110
julia-cli-release julia-cli-debug: julia-cli-% : julia-deps
111111
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/cli $*
112112

113-
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% julia-src-% | $(build_private_libdir)
113+
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% | $(build_private_libdir)
114114
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-$*
115115

116+
# Useful for cross-bootstrapping
117+
julia-sysbase-release julia-sysbase-debug : julia-sysbase-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% | $(build_private_libdir)
118+
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysbase-$*
119+
116120
julia-debug julia-release : julia-% : julia-sysimg-% julia-src-% julia-symlink julia-libccalltest \
117121
julia-libccalllazyfoo julia-libccalllazybar julia-libllvmcalltest julia-base-cache
118122

@@ -136,6 +140,15 @@ else
136140
$(warn "Skipping whitespace check because git is unavailable")
137141
endif
138142

143+
fix-whitespace:
144+
ifneq ($(NO_GIT), 1)
145+
@# Append the directory containing the julia we just built to the end of `PATH`,
146+
@# to give us the best chance of being able to run this check.
147+
@PATH="$(PATH):$(dir $(JULIA_EXECUTABLE))" julia $(call cygpath_w,$(JULIAHOME)/contrib/check-whitespace.jl) --fix
148+
else
149+
$(warn "Skipping whitespace fix because git is unavailable")
150+
endif
151+
139152
release-candidate: release testall
140153
@$(JULIA_EXECUTABLE) $(JULIAHOME)/contrib/add_license_to_files.jl #add license headers
141154
@#Check documentation
@@ -686,7 +699,7 @@ distcleanall: cleanall
686699
@-$(MAKE) -C $(BUILDROOT)/doc cleanall
687700

688701
.FORCE:
689-
.PHONY: .FORCE default debug release check-whitespace release-candidate \
702+
.PHONY: .FORCE default debug release check-whitespace fix-whitespace release-candidate \
690703
julia-debug julia-release julia-stdlib julia-deps julia-deps-libs \
691704
julia-cli-release julia-cli-debug julia-src-release julia-src-debug \
692705
julia-symlink julia-base julia-sysimg julia-sysimg-ji julia-sysimg-release julia-sysimg-debug \

0 commit comments

Comments
 (0)