Skip to content

Commit 7e8f2c0

Browse files
authored
Introduce libjuliarepl to break dependence on runtime libraries (#36588)
1 parent f26a8c3 commit 7e8f2c0

File tree

81 files changed

+913
-345
lines changed

Some content is hidden

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

81 files changed

+913
-345
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ Note: These instructions are for adding to or improving functionality in the bas
189189
190190
Add new code to Julia's base libraries as follows (this is the "basic" approach; see a more efficient approach in the next section):
191191
192-
1. Edit the appropriate file in the `base/` directory, or add new files if necessary. Create tests for your functionality and add them to files in the `test/` directory. If you're editing C or Scheme code, most likely it lives in `src/` or one of its subdirectories, although some aspects of Julia's REPL initialization live in `ui/`.
192+
1. Edit the appropriate file in the `base/` directory, or add new files if necessary. Create tests for your functionality and add them to files in the `test/` directory. If you're editing C or Scheme code, most likely it lives in `src/` or one of its subdirectories, although some aspects of Julia's REPL initialization live in `cli/`.
193193
194194
2. Add any new files to `sysimg.jl` in order to build them into the Julia system image.
195195

HISTORY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4860,7 +4860,7 @@ New language features
48604860
shell. For example:
48614861
48624862
julia> ;ls
4863-
CONTRIBUTING.md Makefile VERSION deps/ julia@ ui/
4863+
CONTRIBUTING.md Makefile VERSION cli/ deps/ julia@
48644864
DISTRIBUTING.md NEWS.md Windows.inc doc/ src/ usr/
48654865
LICENSE.md README.md base/ etc/ test/
48664866
Make.inc README.windows.md contrib/ examples/ tmp/

Make.inc

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,10 +608,29 @@ else
608608
endif
609609

610610
# On Windows, we want shared library files to end up in $(build_bindir), instead of $(build_libdir)
611+
# We also don't really have a private bindir on windows right now, due to lack of RPATH.
611612
ifeq ($(OS),WINNT)
612613
build_shlibdir := $(build_bindir)
614+
shlibdir := $(bindir)
615+
private_shlibdir := $(bindir)
613616
else
614617
build_shlibdir := $(build_libdir)
618+
shlibdir := $(libdir)
619+
private_shlibdir := $(private_libdir)
620+
endif
621+
622+
# If we're on windows, don't do versioned shared libraries. If we're on OSX,
623+
# put the version number before the .dylib. Otherwise, put it after.
624+
ifeq ($(OS), WINNT)
625+
JL_MAJOR_MINOR_SHLIB_EXT := $(SHLIB_EXT)
626+
else
627+
ifeq ($(OS), Darwin)
628+
JL_MAJOR_MINOR_SHLIB_EXT := $(SOMAJOR).$(SOMINOR).$(SHLIB_EXT)
629+
JL_MAJOR_SHLIB_EXT := $(SOMAJOR).$(SHLIB_EXT)
630+
else
631+
JL_MAJOR_MINOR_SHLIB_EXT := $(SHLIB_EXT).$(SOMAJOR).$(SOMINOR)
632+
JL_MAJOR_SHLIB_EXT := $(SHLIB_EXT).$(SOMAJOR)
633+
endif
615634
endif
616635

617636
ifeq ($(OS), FreeBSD)
@@ -1454,6 +1473,52 @@ JULIA_SYSIMG_debug := $(build_private_libdir)/sys-debug.$(SHLIB_EXT)
14541473
JULIA_SYSIMG_release := $(build_private_libdir)/sys.$(SHLIB_EXT)
14551474
JULIA_SYSIMG := $(JULIA_SYSIMG_$(JULIA_BUILD_MODE))
14561475

1476+
define dep_lib_path
1477+
$$($(PYTHON) $(call python_cygpath,$(JULIAHOME)/contrib/relative_path.py) $(1) $(2))
1478+
endef
1479+
1480+
LIBJULIA_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT))
1481+
LIBJULIA_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT))
1482+
1483+
LIBJULIA_DEBUG_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT))
1484+
LIBJULIA_DEBUG_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT))
1485+
1486+
ifeq ($(OS),WINNT)
1487+
ifeq ($(BINARY),32)
1488+
LIBGCC_NAME := libgcc_s_sjlj-1.$(SHLIB_EXT)
1489+
else
1490+
LIBGCC_NAME := libgcc_s_seh-1.$(SHLIB_EXT)
1491+
endif
1492+
LIBOPENLIBM_NAME := libopenlibm.$(SHLIB_EXT)
1493+
endif
1494+
ifeq ($(OS),Darwin)
1495+
LIBGCC_NAME := libgcc_s.1.$(SHLIB_EXT)
1496+
LIBOPENLIBM_NAME := libopenlibm.3.$(SHLIB_EXT)
1497+
endif
1498+
ifneq ($(findstring $(OS),Linux FreeBSD),)
1499+
LIBGCC_NAME := libgcc_s.$(SHLIB_EXT).1
1500+
LIBOPENLIBM_NAME := libopenlibm.$(SHLIB_EXT).3
1501+
endif
1502+
1503+
LIBGCC_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/$(LIBGCC_NAME))
1504+
LIBGCC_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(private_shlibdir)/$(LIBGCC_NAME))
1505+
LIBOPENLIBM_BUILD_DEPLIB := $(call dep_lib_path,$(build_bindir),$(build_shlibdir)/$(LIBOPENLIBM_NAME))
1506+
LIBOPENLIBM_INSTALL_DEPLIB := $(call dep_lib_path,$(bindir),$(private_shlibdir)/$(LIBOPENLIBM_NAME))
1507+
1508+
# We list:
1509+
# * libgcc_s, because FreeBSD needs to load ours, not the system one.
1510+
# * libopenlibm, because Windows has an untrustworthy libm, and we want to use ours more than theirs
1511+
# * libjulia, which must always come last.
1512+
#
1513+
# We need these four separate variables because:
1514+
# * debug builds must link against libjuliadebug, not libjulia
1515+
# * install time relative paths are not equal to build time relative paths (../lib vs. ../lib/julia)
1516+
# That second point will no longer be true for most deps once they are placed within Artifacts directories.
1517+
LOADER_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBOPENLIBM_BUILD_DEPLIB):$(LIBJULIA_BUILD_DEPLIB)
1518+
LOADER_DEBUG_BUILD_DEP_LIBS = $(LIBGCC_BUILD_DEPLIB):$(LIBOPENLIBM_BUILD_DEPLIB):$(LIBJULIA_DEBUG_BUILD_DEPLIB)
1519+
LOADER_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBOPENLIBM_INSTALL_DEPLIB):$(LIBJULIA_INSTALL_DEPLIB)
1520+
LOADER_DEBUG_INSTALL_DEP_LIBS = $(LIBGCC_INSTALL_DEPLIB):$(LIBOPENLIBM_INSTALL_DEPLIB):$(LIBJULIA_DEBUG_INSTALL_DEPLIB)
1521+
14571522
# Colors for make
14581523
ifndef VERBOSE
14591524
VERBOSE := 0

Makefile

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ all: debug release
99
# sort is used to remove potential duplicates
1010
DIRS := $(sort $(build_bindir) $(build_depsbindir) $(build_libdir) $(build_private_libdir) $(build_libexecdir) $(build_includedir) $(build_includedir)/julia $(build_sysconfdir)/julia $(build_datarootdir)/julia $(build_datarootdir)/julia/stdlib $(build_man1dir))
1111
ifneq ($(BUILDROOT),$(JULIAHOME))
12-
BUILDDIRS := $(BUILDROOT) $(addprefix $(BUILDROOT)/,base src src/flisp src/support src/clangsa ui doc deps stdlib test test/embedding test/llvmpasses)
12+
BUILDDIRS := $(BUILDROOT) $(addprefix $(BUILDROOT)/,base src src/flisp src/support src/clangsa cli doc deps stdlib test test/embedding test/llvmpasses)
1313
BUILDDIRMAKE := $(addsuffix /Makefile,$(BUILDDIRS)) $(BUILDROOT)/sysimage.mk
1414
DIRS := $(DIRS) $(BUILDDIRS)
1515
$(BUILDDIRMAKE): | $(BUILDDIRS)
@@ -46,7 +46,7 @@ julia_flisp.boot.inc.phony: julia-deps
4646
$(BUILDROOT)/doc/_build/html/en/index.html: $(shell find $(BUILDROOT)/base $(BUILDROOT)/doc \( -path $(BUILDROOT)/doc/_build -o -path $(BUILDROOT)/doc/deps -o -name *_constants.jl -o -name *_h.jl -o -name version_git.jl \) -prune -o -type f -print)
4747
@$(MAKE) docs
4848

49-
julia-symlink: julia-ui-$(JULIA_BUILD_MODE)
49+
julia-symlink: julia-cli-$(JULIA_BUILD_MODE)
5050
ifeq ($(OS),WINNT)
5151
@echo '@"%~dp0"\'"$$(echo $(call rel_path,$(BUILDROOT),$(JULIA_EXECUTABLE)) | tr / '\\')" '%*' > $(BUILDROOT)/julia.bat
5252
chmod a+x $(BUILDROOT)/julia.bat
@@ -74,16 +74,16 @@ julia-libllvmcalltest: julia-deps
7474
julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.inc.phony
7575
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/src libjulia-$*
7676

77-
julia-ui-release julia-ui-debug : julia-ui-% : julia-src-%
78-
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/ui julia-$*
77+
julia-cli-release julia-cli-debug : julia-cli-% : julia-src-%
78+
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/cli julia-$*
7979

80-
julia-sysimg-ji : julia-stdlib julia-base julia-ui-$(JULIA_BUILD_MODE) | $(build_private_libdir)
80+
julia-sysimg-ji : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) | $(build_private_libdir)
8181
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-ji JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)'
8282

83-
julia-sysimg-bc : julia-stdlib julia-base julia-ui-$(JULIA_BUILD_MODE) | $(build_private_libdir)
83+
julia-sysimg-bc : julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) | $(build_private_libdir)
8484
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-bc JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)'
8585

86-
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-sysimg-ji julia-ui-%
86+
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-sysimg-ji julia-cli-%
8787
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-$*
8888

8989
julia-debug julia-release : julia-% : julia-sysimg-% julia-symlink julia-libccalltest julia-libllvmcalltest julia-base-cache
@@ -154,9 +154,9 @@ julia-base-cache: julia-sysimg-$(JULIA_BUILD_MODE) | $(DIRS) $(build_datarootdir
154154
$(call cygpath_w,$(build_datarootdir)/julia/base.cache))
155155

156156
# public libraries, that are installed in $(prefix)/lib
157-
JL_TARGETS := julia
157+
JL_TARGETS := julia julialoader
158158
ifeq ($(BUNDLE_DEBUG_LIBS),1)
159-
JL_TARGETS += julia-debug
159+
JL_TARGETS += julia-debug julialoader-debug
160160
endif
161161

162162
# private libraries, that are installed in $(prefix)/lib/julia
@@ -268,7 +268,7 @@ endif
268268

269269

270270
define stringreplace
271-
$(build_depsbindir)/stringreplace $$(strings -t x - $1 | grep '$2' | awk '{print $$1;}') '$3' 255 "$(call cygpath_w,$1)"
271+
$(build_depsbindir)/stringreplace $$(strings -t x - $1 | grep $2 | awk '{print $$1;}') $3 255 "$(call cygpath_w,$1)"
272272
endef
273273

274274
# Run fixup-libgfortran on all platforms but Windows and FreeBSD. On FreeBSD we
@@ -413,8 +413,19 @@ endif
413413
if [ $(BUNDLE_DEBUG_LIBS) = 1 ]; then \
414414
$(call stringreplace,$${DEBUG_TARGET},sys-debug.$(SHLIB_EXT)$$,$(private_libdir_rel)/sys-debug.$(SHLIB_EXT)); \
415415
fi;
416+
endif
417+
418+
ifneq ($(LOADER_BUILD_DEP_LIBS),$(LOADER_INSTALL_DEP_LIBS))
419+
# Next, overwrite relative path to libjulia in our loaders if $(LOADER_BUILD_DEP_LIBS) != $(LOADER_INSTALL_DEP_LIBS)
420+
$(call stringreplace,$(DESTDIR)$(bindir)/julia,$(LOADER_BUILD_DEP_LIBS)$$,$(LOADER_INSTALL_DEP_LIBS))
421+
$(call stringreplace,$(DESTDIR)$(shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_BUILD_DEP_LIBS)$$,$(LOADER_INSTALL_DEP_LIBS))
416422

423+
ifeq ($(BUNDLE_DEBUG_LIBS),1)
424+
$(call stringreplace,$(DESTDIR)$(bindir)/julia-debug,$(LOADER_DEBUG_BUILD_DEP_LIBS)$$,$(LOADER_DEBUG_INSTALL_DEP_LIBS))
425+
$(call stringreplace,$(DESTDIR)$(shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT),$(LOADER_DEBUG_BUILD_DEP_LIBS)$$,$(LOADER_DEBUG_INSTALL_DEP_LIBS))
417426
endif
427+
endif
428+
418429
# On FreeBSD, remove the build's libdir from each library's RPATH
419430
ifeq ($(OS),FreeBSD)
420431
$(JULIAHOME)/contrib/fixup-rpath.sh "$(PATCHELF)" $(DESTDIR)$(libdir) $(build_libdir)
@@ -435,6 +446,12 @@ endif
435446
ifeq ($(DARWIN_FRAMEWORK),1)
436447
$(MAKE) -C $(JULIAHOME)/contrib/mac/framework frameworknoinstall
437448
endif
449+
ifeq ($(OS),Linux)
450+
ifeq ($(prefix),$(abspath julia-$(JULIA_COMMIT)))
451+
# Only fixup libstdc++ if `prefix` is not set.
452+
-$(JULIAHOME)/contrib/fixup-libstdc++.sh $(DESTDIR)$(libdir) $(DESTDIR)$(private_libdir)
453+
endif
454+
endif
438455

439456
distclean:
440457
-rm -fr $(BUILDROOT)/julia-*.tar.gz $(BUILDROOT)/julia*.exe $(BUILDROOT)/julia-$(JULIA_COMMIT)
@@ -457,9 +474,7 @@ endif
457474
@$(MAKE) -C $(BUILDROOT) -f $(JULIAHOME)/Makefile install
458475
cp $(JULIAHOME)/LICENSE.md $(BUILDROOT)/julia-$(JULIA_COMMIT)
459476
ifeq ($(OS), Linux)
460-
-$(JULIAHOME)/contrib/fixup-libstdc++.sh $(DESTDIR)$(libdir) $(DESTDIR)$(private_libdir)
461-
462-
# Copy over any bundled ca certs we picked up from the system during buildi
477+
# Copy over any bundled ca certs we picked up from the system during build
463478
-cp $(build_datarootdir)/julia/cert.pem $(DESTDIR)$(datarootdir)/julia/
464479
endif
465480
ifeq ($(OS), WINNT)
@@ -531,7 +546,7 @@ clean: | $(CLEAN_TARGETS)
531546
@-$(MAKE) -C $(BUILDROOT)/base clean
532547
@-$(MAKE) -C $(BUILDROOT)/doc clean
533548
@-$(MAKE) -C $(BUILDROOT)/src clean
534-
@-$(MAKE) -C $(BUILDROOT)/ui clean
549+
@-$(MAKE) -C $(BUILDROOT)/cli clean
535550
@-$(MAKE) -C $(BUILDROOT)/test clean
536551
@-$(MAKE) -C $(BUILDROOT)/stdlib clean
537552
-rm -f $(BUILDROOT)/julia
@@ -555,7 +570,7 @@ distcleanall: cleanall
555570

556571
.PHONY: default debug release check-whitespace release-candidate \
557572
julia-debug julia-release julia-stdlib julia-deps julia-deps-libs \
558-
julia-ui-release julia-ui-debug julia-src-release julia-src-debug \
573+
julia-cli-release julia-cli-debug julia-src-release julia-src-debug \
559574
julia-symlink julia-base julia-sysimg julia-sysimg-ji julia-sysimg-release julia-sysimg-debug \
560575
test testall testall1 test test-* test-revise-* \
561576
clean distcleanall cleanall clean-* \

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ The Julia source code is organized as follows:
121121
| - | - |
122122
| `base/` | source code for the Base module (part of Julia's standard library) |
123123
| `stdlib/` | source code for other standard library packages |
124+
| `cli/` | source for the command line interface/REPL |
124125
| `contrib/` | editor support for Julia source, miscellaneous scripts |
125126
| `deps/` | external dependencies |
126127
| `doc/src/manual/` | source for the user manual |
127128
| `doc/build/` | detailed notes for building Julia |
128129
| `src/` | source for Julia language core |
129130
| `test/` | test suites |
130-
| `ui/` | source for various front ends |
131131
| `usr/` | binaries and shared libraries loaded by Julia's standard libraries |
132132

133133
## Terminal, Editors and IDEs

base/Base.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ using .Iterators: Flatten, Filter, product # for generators
115115

116116
include("namedtuple.jl")
117117

118+
# For OS specific stuff
119+
# We need to strcat things here, before strings are really defined
120+
function strcat(x::String, y::String)
121+
out = ccall(:jl_alloc_string, Ref{String}, (Csize_t,), Core.sizeof(x) + Core.sizeof(y))
122+
GC.@preserve x y out begin
123+
out_ptr = unsafe_convert(Ptr{UInt8}, out)
124+
unsafe_copyto!(out_ptr, unsafe_convert(Ptr{UInt8}, x), Core.sizeof(x))
125+
unsafe_copyto!(out_ptr + Core.sizeof(x), unsafe_convert(Ptr{UInt8}, y), Core.sizeof(y))
126+
end
127+
return out
128+
end
129+
include(strcat((length(Core.ARGS)>=2 ? Core.ARGS[2] : ""), "build_h.jl")) # include($BUILDROOT/base/build_h.jl)
130+
include(strcat((length(Core.ARGS)>=2 ? Core.ARGS[2] : ""), "version_git.jl")) # include($BUILDROOT/base/version_git.jl)
131+
118132
# numeric operations
119133
include("hashing.jl")
120134
include("rounding.jl")
@@ -163,10 +177,6 @@ include("strings/basic.jl")
163177
include("strings/string.jl")
164178
include("strings/substring.jl")
165179

166-
# For OS specific stuff
167-
include(string((length(Core.ARGS)>=2 ? Core.ARGS[2] : ""), "build_h.jl")) # include($BUILDROOT/base/build_h.jl)
168-
include(string((length(Core.ARGS)>=2 ? Core.ARGS[2] : ""), "version_git.jl")) # include($BUILDROOT/base/version_git.jl)
169-
170180
# Initialize DL_LOAD_PATH as early as possible. We are defining things here in
171181
# a slightly more verbose fashion than usual, because we're running so early.
172182
const DL_LOAD_PATH = String[]

base/rounding.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ See [`RoundingMode`](@ref) for available modes.
151151
"""
152152
:rounding
153153

154-
setrounding_raw(::Type{<:Union{Float32,Float64}}, i::Integer) = ccall(:fesetround, Int32, (Int32,), i)
155-
rounding_raw(::Type{<:Union{Float32,Float64}}) = ccall(:fegetround, Int32, ())
154+
setrounding_raw(::Type{<:Union{Float32,Float64}}, i::Integer) = ccall((:fesetround, Base.libm_name), Int32, (Int32,), i)
155+
rounding_raw(::Type{<:Union{Float32,Float64}}) = ccall((:fegetround, Base.libm_name), Int32, ())
156156

157157
rounding(::Type{T}) where {T<:Union{Float32,Float64}} = from_fenv(rounding_raw(T))
158158

File renamed without changes.

ui/Makefile renamed to cli/Makefile

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,46 @@ include $(JULIAHOME)/deps/Versions.make
55
include $(JULIAHOME)/Make.inc
66
include $(JULIAHOME)/deps/llvm-ver.make
77

8-
override CFLAGS += $(JCFLAGS)
9-
override CXXFLAGS += $(JCXXFLAGS)
10-
override CPPFLAGS += $(JCPPFLAGS)
11-
12-
SRCS := repl
138

149
HEADERS := $(addprefix $(JULIAHOME)/src/,julia.h julia_assert.h julia_threads.h julia_internal.h options.h) \
1510
$(BUILDDIR)/../src/julia_version.h $(wildcard $(JULIAHOME)/src/support/*.h) $(LIBUV_INC)/uv.h
1611

17-
FLAGS := -I$(BUILDROOT)/src -I$(JULIAHOME)/src -I$(JULIAHOME)/src/support -I$(build_includedir)
18-
ifneq ($(USEMSVC), 1)
19-
FLAGS += -Wall -Wno-strict-aliasing -fno-omit-frame-pointer -Wc++-compat
20-
endif
12+
LOADER_CFLAGS = $(JCFLAGS) -I$(BUILDROOT)/src -I$(JULIAHOME)/src -I$(JULIAHOME)/src/support -I$(build_includedir) -ffreestanding
13+
LOADER_LDFLAGS = $(JLDFLAGS) -ffreestanding
2114

22-
OBJS := $(SRCS:%=$(BUILDDIR)/%.o)
23-
DOBJS := $(SRCS:%=$(BUILDDIR)/%.dbg.obj)
24-
DEBUGFLAGS += $(FLAGS)
25-
SHIPFLAGS += $(FLAGS)
26-
JLDFLAGS += $(LDFLAGS) $(NO_WHOLE_ARCHIVE) $(OSLIBS) $(RPATH)
27-
28-
ifeq ($(USE_SYSTEM_LIBM),0)
29-
ifneq ($(UNTRUSTED_SYSTEM_LIBM),0)
30-
JLDFLAGS += $(WHOLE_ARCHIVE) $(build_libdir)/libopenlibm.a $(NO_WHOLE_ARCHIVE)
31-
endif
15+
ifeq ($(OS),WINNT)
16+
LOADER_CFLAGS += -municode -mconsole -nostdlib -fno-stack-check -fno-stack-protector -mno-stack-arg-probe
3217
endif
3318

3419
ifeq ($(OS),WINNT)
35-
JLDFLAGS += -municode
20+
LOADER_LDFLAGS += -municode -mconsole -nostdlib --disable-auto-import \
21+
--disable-runtime-pseudo-reloc -lntdll -lkernel32 -lpsapi
22+
else ifeq ($(OS),Linux)
23+
LOADER_LDFLAGS += -Wl,--no-as-needed -ldl -lpthread -rdynamic -lc -Wl,--as-needed
24+
else ifeq ($(OS),FreeBSD)
25+
LOADER_LDFLAGS += -Wl,--no-as-needed -ldl -lpthread -rdynamic -lc -Wl,--as-needed
26+
else ifeq ($(OS),Darwin)
27+
LOADER_LDFLAGS += -lSystem
3628
endif
3729

30+
# Build list of dependent libraries that must be opened
31+
SHIPFLAGS += -DDEP_LIBS="\"$(LOADER_BUILD_DEP_LIBS)\""
32+
DEBUGFLAGS += -DDEP_LIBS="\"$(LOADER_DEBUG_BUILD_DEP_LIBS)\""
33+
34+
SRCS := loader_exe loader_lib
35+
OBJS := $(SRCS:%=$(BUILDDIR)/%.o)
36+
DOBJS := $(SRCS:%=$(BUILDDIR)/%.dbg.obj)
37+
LIB_OBJS := $(BUILDDIR)/loader_lib.o
38+
LIB_DOBJS := $(BUILDDIR)/loader_lib.dbg.obj
39+
3840
default: release
3941
all: release debug
4042
release debug : % : julia-%
4143

4244
$(BUILDDIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
43-
@$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(SHIPFLAGS) -c $< -o $@)
45+
@$(call PRINT_CC, $(CC) $(SHIPFLAGS) $(LOADER_CFLAGS) -c $< -o $@)
4446
$(BUILDDIR)/%.dbg.obj: $(SRCDIR)/%.c $(HEADERS)
45-
@$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(DEBUGFLAGS) -c $< -o $@)
47+
@$(call PRINT_CC, $(CC) $(DEBUGFLAGS) $(LOADER_CFLAGS) -c $< -o $@)
4648

4749
ifeq ($(OS),WINNT)
4850
ifneq ($(USEMSVC), 1)
@@ -57,8 +59,8 @@ DOBJS += julia_res.o
5759
endif
5860
endif
5961

60-
julia-release: $(build_bindir)/julia$(EXE)
61-
julia-debug: $(build_bindir)/julia-debug$(EXE)
62+
julia-release: $(build_bindir)/julia$(EXE) $(build_shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT)
63+
julia-debug: $(build_bindir)/julia-debug$(EXE) $(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)
6264

6365
# Embed an Info.plist in the julia executable
6466
# Create an intermediate target Info.plist for Darwin code signing.
@@ -76,16 +78,27 @@ $(build_bindir)/julia$(EXE): $(BUILDDIR)/Info.plist
7678
$(build_bindir)/julia-debug$(EXE): $(BUILDDIR)/Info.plist
7779
endif
7880

79-
ifneq ($(USEMSVC), 1)
80-
CXXLD := $(CXX)
81-
else
82-
CXXLD := $(LD)
81+
$(build_shlibdir)/libjulialoader.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_OBJS)
82+
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) -shared $(SHIPFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB))
83+
ifneq ($(OS), WINNT)
84+
@ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader.$(JL_MAJOR_SHLIB_EXT)
85+
@ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader.$(SHLIB_EXT)
86+
endif
87+
88+
89+
$(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_DOBJS)
90+
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) -shared $(DEBUGFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH_LIB))
91+
ifneq ($(OS), WINNT)
92+
@ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader-debug.$(JL_MAJOR_SHLIB_EXT)
93+
@ln -sf $(notdir $@) $(build_shlibdir)/libjulialoader-debug.$(SHLIB_EXT)
8394
endif
8495

8596
$(build_bindir)/julia$(EXE): $(OBJS)
86-
@$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(LINK_FLAGS) $(SHIPFLAGS) $(OBJS) -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia $(JLDFLAGS) $(CXXLDFLAGS))
97+
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(SHIPFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH))
98+
8799
$(build_bindir)/julia-debug$(EXE): $(DOBJS)
88-
@$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(LINK_FLAGS) $(DEBUGFLAGS) $(DOBJS) -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia-debug $(JLDFLAGS) $(CXXLDFLAGS))
100+
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(DEBUGFLAGS) $^ -o $@ $(LOADER_LDFLAGS) $(RPATH))
101+
89102

90103
clean: | $(CLEAN_TARGETS)
91104
rm -f *.o *.dbg.obj

0 commit comments

Comments
 (0)