diff --git a/.travis.yml b/.travis.yml index 1f45c08d32008..92f6b94ea4618 100644 --- a/.travis.yml +++ b/.travis.yml @@ -138,9 +138,9 @@ script: - popd # test that the embedding code works on our installation - mkdir /tmp/embedding-test && - make check -C /tmp/julia/share/julia/test/embedding \ - JULIA="/tmp/julia/bin/julia" \ - BIN=/tmp/embedding-test \ + make check -C /tmp/julia/share/julia/test/embedding + JULIA="/tmp/julia/bin/julia" + BIN=/tmp/embedding-test "$(cd julia2 && make print-CC)" # restore initial state and prepare for travis caching - mv julia2 julia && diff --git a/Make.inc b/Make.inc index e9cb2411981e5..344ddaf532718 100644 --- a/Make.inc +++ b/Make.inc @@ -284,16 +284,10 @@ OPENBLAS_DYNAMIC_ARCH := 1 override CROSS_COMPILE:=$(XC_HOST)- ifneq (,$(findstring mingw,$(XC_HOST))) override OS := WINNT -STD_LIB_PATH := $(shell LANG=C $(CROSS_COMPILE)gcc -print-search-dirs | grep programs | sed -e "s/^programs: =//") -STD_LIB_PATH := $(STD_LIB_PATH):$(shell LANG=C $(CROSS_COMPILE)gcc -print-search-dirs | grep libraries | sed -e "s/^libraries: =//") -ifneq (,$(findstring CYGWIN,$(BUILD_OS))) # the cygwin-mingw32 compiler lies about it search directory paths -STD_LIB_PATH := $(shell echo '$(STD_LIB_PATH)' | sed -e "s!/lib/!/bin/!g") -endif else $(error "unknown XC_HOST variable set") endif endif -STD_LIB_PATH ?= $(PATH) JLDOWNLOAD := $(JULIAHOME)/deps/tools/jldownload JLCHECKSUM := $(JULIAHOME)/deps/tools/jlchecksum @@ -1169,7 +1163,6 @@ endif # Make tricks define dir_target -$$(subst $$(abspath $(JULIAHOME))/,,$$(abspath $(1))): $$(abspath $(1)) $$(abspath $(1)): @mkdir -p $$@ endef @@ -1188,7 +1181,6 @@ ifeq ($(BUILD_OS), WINNT) else -rm -r $$(abspath $(2)/$(3)) endif -$$(subst $$(abspath $(JULIAHOME))/,,$$(abspath $(2)/$(3))): $$(abspath $(2)/$(3)) $$(abspath $(2)/$(3)): | $$(abspath $(2)) ifeq ($$(BUILD_OS), WINNT) @cmd //C mklink //J $$(call mingw_to_dos,$(2)/$(3),cd $(2) &&) $$(call mingw_to_dos,$(1),) @@ -1222,8 +1214,6 @@ endif exec = $(shell $(call spawn,$(1))) -pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(2))))) - JULIA_BUILD_MODE := release JULIA_LIBSUFFIX:= ifeq (,$(findstring release,$(MAKECMDGOALS))) @@ -1277,7 +1267,13 @@ PRINT_JULIA = echo '$(subst ','\'',$(1))'; $(1) endif +define newline # a literal \n + + +endef + # Makefile debugging trick: # call print-VARIABLE to see the runtime value of any variable +# (hardened against any special characters appearing in the output) print-%: - @echo '$*=$($*)' + @echo '$*=$(subst ','\'',$(subst $(newline),\n,$($*)))' diff --git a/Makefile b/Makefile index ea67778254cbe..54f138d9a3852 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ all: debug release 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)) ifneq ($(BUILDROOT),$(JULIAHOME)) BUILDDIRS := $(BUILDROOT) $(addprefix $(BUILDROOT)/,base src ui doc deps stdlib test test/embedding test/llvmpasses) -BUILDDIRMAKE := $(addsuffix /Makefile,$(BUILDDIRS)) +BUILDDIRMAKE := $(addsuffix /Makefile,$(BUILDDIRS)) $(BUILDROOT)/sysimage.mk DIRS := $(DIRS) $(BUILDDIRS) $(BUILDDIRMAKE): | $(BUILDDIRS) @# add Makefiles to the build directories for convenience (pointing back to the source location of each) @@ -74,16 +74,13 @@ julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.in julia-ui-release julia-ui-debug : julia-ui-% : julia-src-% @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/ui julia-$* -julia-sysimg : julia-base julia-ui-$(JULIA_BUILD_MODE) - @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) $(build_private_libdir)/sys.ji JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)' +julia-sysimg-ji : julia-stdlib julia-base julia-ui-$(JULIA_BUILD_MODE) | $(build_private_libdir) + @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-ji JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)' -julia-sysimg-release : julia-stdlib julia-sysimg julia-ui-release - @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) $(build_private_libdir)/sys.$(SHLIB_EXT) +julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-sysimg-ji julia-ui-% + @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-$* -julia-sysimg-debug : julia-stdlib julia-sysimg julia-ui-debug - @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) $(build_private_libdir)/sys-debug.$(SHLIB_EXT) - -julia-debug julia-release : julia-% : julia-ui-% julia-sysimg-% julia-symlink julia-libccalltest julia-libllvmcalltest julia-base-cache +julia-debug julia-release : julia-% : julia-sysimg-% julia-symlink julia-libccalltest julia-libllvmcalltest julia-base-cache debug release : % : julia-% @@ -140,83 +137,9 @@ $(build_sysconfdir)/julia/startup.jl: $(JULIAHOME)/etc/startup.jl | $(build_sysc @echo Creating usr/etc/julia/startup.jl @cp $< $@ -$(build_datarootdir)/julia/julia-config.jl : $(JULIAHOME)/contrib/julia-config.jl | $(build_datarootdir)/julia +$(build_datarootdir)/julia/julia-config.jl: $(JULIAHOME)/contrib/julia-config.jl | $(build_datarootdir)/julia $(INSTALL_M) $< $(dir $@) -$(build_private_libdir)/%.$(SHLIB_EXT): $(build_private_libdir)/%-o.a - @$(call PRINT_LINK, $(CXX) $(LDFLAGS) -shared $(fPIC) -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -o $@ \ - $(WHOLE_ARCHIVE) $< $(NO_WHOLE_ARCHIVE) \ - $(if $(findstring -debug,$(notdir $@)),-ljulia-debug,-ljulia) \ - $$([ $(OS) = WINNT ] && echo '' -lssp)) - @$(INSTALL_NAME_CMD)$(notdir $@) $@ - @$(DSYMUTIL) $@ - -COMPILER_SRCS := $(addprefix $(JULIAHOME)/, \ - base/boot.jl \ - base/docs/core.jl \ - base/abstractarray.jl \ - base/abstractdict.jl \ - base/array.jl \ - base/bitarray.jl \ - base/bitset.jl \ - base/bool.jl \ - base/ctypes.jl \ - base/error.jl \ - base/essentials.jl \ - base/expr.jl \ - base/generator.jl \ - base/int.jl \ - base/indices.jl \ - base/iterators.jl \ - base/namedtuple.jl \ - base/number.jl \ - base/operators.jl \ - base/options.jl \ - base/pair.jl \ - base/pointer.jl \ - base/promotion.jl \ - base/range.jl \ - base/reflection.jl \ - base/traits.jl \ - base/refvalue.jl \ - base/tuple.jl) -COMPILER_SRCS += $(shell find $(JULIAHOME)/base/compiler -name \*.jl) -# sort these to remove duplicates -BASE_SRCS := $(sort $(shell find $(JULIAHOME)/base -name \*.jl -and -not -name sysimg.jl) \ - $(shell find $(BUILDROOT)/base -name \*.jl -and -not -name sysimg.jl)) -STDLIB_SRCS := $(JULIAHOME)/base/sysimg.jl $(shell find $(build_datarootdir)/julia/stdlib/$(VERSDIR)/*/src -name \*.jl) -RELBUILDROOT := $(shell $(JULIAHOME)/contrib/relative_path.sh "$(JULIAHOME)/base" "$(BUILDROOT)/base/") - -$(build_private_libdir)/corecompiler.ji: $(COMPILER_SRCS) | $(build_private_libdir) - @$(call PRINT_JULIA, cd $(JULIAHOME)/base && \ - $(call spawn,$(JULIA_EXECUTABLE)) -C "$(JULIA_CPU_TARGET)" --output-ji $(call cygpath_w,$@).tmp \ - --startup-file=no -g0 -O0 compiler/compiler.jl) - @mv $@.tmp $@ - -COMMA:=, -$(build_private_libdir)/sys.ji: $(build_private_libdir)/corecompiler.ji $(JULIAHOME)/VERSION $(BASE_SRCS) $(STDLIB_SRCS) - @$(call PRINT_JULIA, cd $(JULIAHOME)/base && \ - if ! $(call spawn,$(JULIA_EXECUTABLE)) -g1 -O0 -C "$(JULIA_CPU_TARGET)" --output-ji $(call cygpath_w,$@).tmp $(JULIA_SYSIMG_BUILD_FLAGS) \ - --startup-file=no --warn-overwrite=yes --sysimage $(call cygpath_w,$<) sysimg.jl $(RELBUILDROOT); then \ - echo '*** This error might be fixed by running `make clean`. If the error persists$(COMMA) try `make cleanall`. ***'; \ - false; \ - fi ) - @mv $@.tmp $@ - -define sysimg_builder -$$(build_private_libdir)/sys$1-o.a $$(build_private_libdir)/sys$1-bc.a : $$(build_private_libdir)/sys$1-%.a : $$(build_private_libdir)/sys.ji - @$$(call PRINT_JULIA, cd $$(JULIAHOME)/base && \ - if ! $$(call spawn,$3) $2 -C "$$(JULIA_CPU_TARGET)" --output-$$* $$(call cygpath_w,$$@).tmp $$(JULIA_SYSIMG_BUILD_FLAGS) \ - --startup-file=no --warn-overwrite=yes --sysimage $$(call cygpath_w,$$<) $$(call cygpath_w,$$(JULIAHOME)/contrib/generate_precompile.jl) $(JULIA_PRECOMPILE); then \ - echo '*** This error is usually fixed by running `make clean`. If the error persists$$(COMMA) try `make cleanall`. ***'; \ - false; \ - fi ) - @mv $$@.tmp $$@ -.SECONDARY: $$(build_private_libdir)/sys$1-o.a $(build_private_libdir)/sys$1-bc.a # request Make to keep these files around -endef -$(eval $(call sysimg_builder,,-O3,$(JULIA_EXECUTABLE_release))) -$(eval $(call sysimg_builder,-debug,-O0,$(JULIA_EXECUTABLE_debug))) - $(build_depsbindir)/stringreplace: $(JULIAHOME)/contrib/stringreplace.c | $(build_depsbindir) @$(call PRINT_CC, $(HOSTCC) -o $(build_depsbindir)/stringreplace $(JULIAHOME)/contrib/stringreplace.c) @@ -284,14 +207,28 @@ $(eval $(call std_so,libquadmath)) endif # FreeBSD ifeq ($(OS),WINNT) +# find the standard .dll folders +ifeq ($(XC_HOST),) +STD_LIB_PATH ?= $(PATH) +else +STD_LIB_PATH := $(shell LANG=C $(CC) -print-search-dirs | grep programs | sed -e "s/^programs: =//") +STD_LIB_PATH += :$(shell LANG=C $(CC) -print-search-dirs | grep libraries | sed -e "s/^libraries: =//") +ifneq (,$(findstring CYGWIN,$(BUILD_OS))) # the cygwin-mingw32 compiler lies about it search directory paths +STD_LIB_PATH := $(shell echo '$(STD_LIB_PATH)' | sed -e "s!/lib/!/bin/!g") +endif +endif + +pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(2))))) + define std_dll -julia-deps: | $$(build_bindir)/lib$(1).dll $$(build_depsbindir)/lib$(1).dll +julia-deps-libs: | $$(build_bindir)/lib$(1).dll $$(build_depsbindir)/lib$(1).dll $$(build_bindir)/lib$(1).dll: | $$(build_bindir) - cp $$(call pathsearch,lib$(1).dll,$$(STD_LIB_PATH)) $$(build_bindir) + cp $$(or $$(call pathsearch,lib$(1).dll,$$(STD_LIB_PATH)),$$(error can't find lib$1.dll)) $$(build_bindir) $$(build_depsbindir)/lib$(1).dll: | $$(build_depsbindir) - cp $$(call pathsearch,lib$(1).dll,$$(STD_LIB_PATH)) $$(build_depsbindir) + cp $$(or $$(call pathsearch,lib$(1).dll,$$(STD_LIB_PATH)),$$(error can't find lib$1.dll)) $$(build_depsbindir) JL_TARGETS += $(1) endef +julia-deps: julia-deps-libs # Given a list of space-separated libraries, return the first library name that is # correctly found through `pathsearch`. @@ -582,9 +519,9 @@ distcleanall: cleanall @-$(MAKE) -C $(BUILDROOT)/doc cleanall .PHONY: default debug release check-whitespace release-candidate \ - julia-debug julia-release julia-deps \ + julia-debug julia-release julia-stdlib julia-deps julia-deps-libs \ julia-ui-release julia-ui-debug julia-src-release julia-src-debug \ - julia-symlink julia-base julia-sysimg julia-sysimg-release julia-sysimg-debug \ + julia-symlink julia-base julia-sysimg julia-sysimg-ji julia-sysimg-release julia-sysimg-debug \ test testall testall1 test clean distcleanall cleanall clean-* \ run-julia run-julia-debug run-julia-release run \ install binary-dist light-source-dist.tmp light-source-dist \ @@ -594,8 +531,11 @@ test: check-whitespace $(JULIA_BUILD_MODE) @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/test default JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) JULIA_SYSIMG=$(build_private_libdir)/sys$(JULIA_LIBSUFFIX).$(SHLIB_EXT) + testall: check-whitespace $(JULIA_BUILD_MODE) - cp $(JULIA_SYSIMG) $(BUILDROOT)/local.$(SHLIB_EXT) && $(call spawn, $(JULIA_EXECUTABLE) -J $(call cygpath_w,$(BUILDROOT)/local.$(SHLIB_EXT)) -e 'true' && rm $(BUILDROOT)/local.$(SHLIB_EXT)) + cp $(JULIA_SYSIMG) $(BUILDROOT)/local.$(SHLIB_EXT) + $(call spawn,$(JULIA_EXECUTABLE) -J $(call cygpath_w,$(BUILDROOT)/local.$(SHLIB_EXT) -e 'true') + rm $(BUILDROOT)/local.$(SHLIB_EXT) @$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/test all JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) testall1: check-whitespace $(JULIA_BUILD_MODE) diff --git a/base/Makefile b/base/Makefile index acdd4bb9f82d6..63bbbef09c23e 100644 --- a/base/Makefile +++ b/base/Makefile @@ -194,12 +194,11 @@ $(eval $(call symlink_system_library,libcolamd,SUITESPARSE)) $(eval $(call symlink_system_library,libumfpack,SUITESPARSE)) $(eval $(call symlink_system_library,libspqr,SUITESPARSE)) $(eval $(call symlink_system_library,libsuitesparseconfig,SUITESPARSE)) -ifneq ($(DISABLE_LIBUNWIND),0) -$(eval $(call symlink_system_library,libunwind,LIBUNWIND)) -endif +# EXCLUDED LIBRARIES (installed/used, but not vendored for use with dlopen): +# libunwind endif # WINNT -symlink_libLLVM: $(build_private_libdir)/libLLVM.dylib +symlink_libLLVM: $(build_private_libdir)/libLLVM.$(SHLIB_EXT) ifneq ($(USE_SYSTEM_LLVM),0) LLVM_CONFIG_HOST_LIBS := $(shell $(LLVM_CONFIG_HOST) --libfiles) # HACK: llvm-config doesn't correctly point to shared libs on all platforms @@ -207,7 +206,7 @@ LLVM_CONFIG_HOST_LIBS := $(shell $(LLVM_CONFIG_HOST) --libfiles) else LLVM_CONFIG_HOST_LIBS := $(shell $(LLVM_CONFIG_HOST) --libdir)/libLLVM.$(SHLIB_EXT) endif -$(build_private_libdir)/libLLVM.dylib: +$(build_private_libdir)/libLLVM.$(SHLIB_EXT): REALPATH=$(LLVM_CONFIG_HOST_LIBS) && \ $(call resolve_path,REALPATH) && \ [ -e "$$REALPATH" ] && \ diff --git a/src/Makefile b/src/Makefile index e4da8c6357e02..d2fa16f7bb137 100644 --- a/src/Makefile +++ b/src/Makefile @@ -305,7 +305,7 @@ $(BUILDDIR)/libjulia.a: julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUIL libjulia-release: $(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT) $(PUBLIC_HEADER_TARGETS) clean: - -rm -fr $(build_shlibdir)/libjulia* $(build_shlibdir)/libccalltest* + -rm -fr $(build_shlibdir)/libjulia* $(build_shlibdir)/libccalltest* $(build_shlibdir)/libllvmcalltest* -rm -f $(BUILDDIR)/julia_flisp.boot $(BUILDDIR)/julia_flisp.boot.inc -rm -f $(BUILDDIR)/*.dbg.obj $(BUILDDIR)/*.o $(BUILDDIR)/*.dwo $(BUILDDIR)/*.$(SHLIB_EXT) $(BUILDDIR)/*.a -rm -f $(BUILDDIR)/julia_version.h diff --git a/sysimage.mk b/sysimage.mk new file mode 100644 index 0000000000000..6deb1ff826fba --- /dev/null +++ b/sysimage.mk @@ -0,0 +1,87 @@ +SRCDIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) +BUILDDIR := . +JULIAHOME := $(SRCDIR) +include $(JULIAHOME)/Make.inc + +default: sysimg-$(JULIA_BUILD_MODE) # contains either "debug" or "release" +all: sysimg-release sysimg-debug +sysimg-ji: $(build_private_libdir)/sys.ji +sysimg-release: $(build_private_libdir)/sys.$(SHLIB_EXT) +sysimg-debug: $(build_private_libdir)/sys-debug.$(SHLIB_EXT) + +VERSDIR := v`cut -d. -f1-2 < $(JULIAHOME)/VERSION` + +$(build_private_libdir)/%.$(SHLIB_EXT): $(build_private_libdir)/%-o.a + @$(call PRINT_LINK, $(CXX) $(LDFLAGS) -shared $(fPIC) -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -o $@ \ + $(WHOLE_ARCHIVE) $< $(NO_WHOLE_ARCHIVE) \ + $(if $(findstring -debug,$(notdir $@)),-ljulia-debug,-ljulia) \ + $$([ $(OS) = WINNT ] && echo '' -lssp)) + @$(INSTALL_NAME_CMD)$(notdir $@) $@ + @$(DSYMUTIL) $@ + +COMPILER_SRCS := $(addprefix $(JULIAHOME)/, \ + base/boot.jl \ + base/docs/core.jl \ + base/abstractarray.jl \ + base/abstractdict.jl \ + base/array.jl \ + base/bitarray.jl \ + base/bitset.jl \ + base/bool.jl \ + base/ctypes.jl \ + base/error.jl \ + base/essentials.jl \ + base/expr.jl \ + base/generator.jl \ + base/int.jl \ + base/indices.jl \ + base/iterators.jl \ + base/namedtuple.jl \ + base/number.jl \ + base/operators.jl \ + base/options.jl \ + base/pair.jl \ + base/pointer.jl \ + base/promotion.jl \ + base/range.jl \ + base/reflection.jl \ + base/traits.jl \ + base/refvalue.jl \ + base/tuple.jl) +COMPILER_SRCS += $(shell find $(JULIAHOME)/base/compiler -name \*.jl) +# sort these to remove duplicates +BASE_SRCS := $(sort $(shell find $(JULIAHOME)/base -name \*.jl -and -not -name sysimg.jl) \ + $(shell find $(BUILDROOT)/base -name \*.jl -and -not -name sysimg.jl)) +STDLIB_SRCS := $(JULIAHOME)/base/sysimg.jl $(shell find $(build_datarootdir)/julia/stdlib/$(VERSDIR)/*/src -name \*.jl) \ + $(build_prefix)/manifest/Pkg +RELBUILDROOT := $(shell $(JULIAHOME)/contrib/relative_path.sh "$(JULIAHOME)/base" "$(BUILDROOT)/base/") + +$(build_private_libdir)/corecompiler.ji: $(COMPILER_SRCS) + @$(call PRINT_JULIA, cd $(JULIAHOME)/base && \ + $(call spawn,$(JULIA_EXECUTABLE)) -C "$(JULIA_CPU_TARGET)" --output-ji $(call cygpath_w,$@).tmp \ + --startup-file=no -g0 -O0 compiler/compiler.jl) + @mv $@.tmp $@ + +COMMA:=, +$(build_private_libdir)/sys.ji: $(build_private_libdir)/corecompiler.ji $(JULIAHOME)/VERSION $(BASE_SRCS) $(STDLIB_SRCS) + @$(call PRINT_JULIA, cd $(JULIAHOME)/base && \ + if ! $(call spawn,$(JULIA_EXECUTABLE)) -g1 -O0 -C "$(JULIA_CPU_TARGET)" --output-ji $(call cygpath_w,$@).tmp $(JULIA_SYSIMG_BUILD_FLAGS) \ + --startup-file=no --warn-overwrite=yes --sysimage $(call cygpath_w,$<) sysimg.jl $(RELBUILDROOT); then \ + echo '*** This error might be fixed by running `make clean`. If the error persists$(COMMA) try `make cleanall`. ***'; \ + false; \ + fi ) + @mv $@.tmp $@ + +define sysimg_builder +$$(build_private_libdir)/sys$1-o.a $$(build_private_libdir)/sys$1-bc.a : $$(build_private_libdir)/sys$1-%.a : $$(build_private_libdir)/sys.ji + @$$(call PRINT_JULIA, cd $$(JULIAHOME)/base && \ + if ! $$(call spawn,$3) $2 -C "$$(JULIA_CPU_TARGET)" --output-$$* $$(call cygpath_w,$$@).tmp $$(JULIA_SYSIMG_BUILD_FLAGS) \ + --startup-file=no --warn-overwrite=yes --sysimage $$(call cygpath_w,$$<) $$(call cygpath_w,$$(JULIAHOME)/contrib/generate_precompile.jl) $(JULIA_PRECOMPILE); then \ + echo '*** This error is usually fixed by running `make clean`. If the error persists$$(COMMA) try `make cleanall`. ***'; \ + false; \ + fi ) + @mv $$@.tmp $$@ +.SECONDARY: $$(build_private_libdir)/sys$1-o.a $(build_private_libdir)/sys$1-bc.a # request Make to keep these files around +endef +$(eval $(call sysimg_builder,,-O3,$(JULIA_EXECUTABLE_release))) +$(eval $(call sysimg_builder,-debug,-O0,$(JULIA_EXECUTABLE_debug)))