From 09034b25ab26035e3ac2c7391b90897cb4b9f038 Mon Sep 17 00:00:00 2001 From: Yichao Yu Date: Sun, 14 Jun 2015 23:16:51 -0400 Subject: [PATCH] [ci skip] --- .gitignore | 1 + CMakeLists.txt | 287 +++++++++++ Make.inc | 483 +----------------- Makefile | 540 +-------------------- base/CMakeLists.txt | 68 +++ base/Makefile | 54 +-- base/errno_h.jl.cmake | 42 ++ cmake/CatFiles.cmake | 10 + cmake/JuliaCCompiler.cmake | 84 ++++ cmake/JuliaDeps.cmake | 16 + cmake/JuliaDirs.cmake | 80 +++ cmake/JuliaFortranCompiler.cmake | 15 + cmake/JuliaOptions.cmake | 57 +++ cmake/JuliaUtils.cmake | 50 ++ cmake/JuliaVersion.cmake | 59 +++ cmake/jl_custom_target.cmake | 73 +++ contrib/CMakeLists.txt | 6 + contrib/mac/app/Makefile | 1 - contrib/repackage_system_suitesparse4.make | 1 - deps/CMakeLists.txt | 6 + deps/Makefile | 27 +- deps/Versions.make | 16 - doc/CMakeLists.txt | 5 + examples/Makefile | 6 +- src/.gitignore | 1 - src/CMakeLists.txt | 103 ++++ src/Makefile | 164 ------- src/ast.c | 2 +- src/flisp/CMakeLists.txt | 51 ++ src/flisp/Makefile | 104 ---- src/init.c | 6 +- src/julia-config-p.h.in | 9 + src/julia-config.h.in | 12 + src/julia.h | 4 +- src/julia_internal.h | 1 + src/options.h | 2 + src/support/CMakeLists.txt | 42 ++ src/support/Makefile | 78 --- src/toplevel.c | 54 ++- test/CMakeLists.txt | 9 + test/Makefile | 19 +- test/perf/Makefile | 1 - test/perf/micro/Makefile | 3 +- test/perf/shootout/Makefile | 3 +- test/version.jl | 2 +- ui/CMakeLists.txt | 62 +++ ui/Makefile | 81 ---- ui/repl.c | 11 +- 48 files changed, 1279 insertions(+), 1532 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 base/CMakeLists.txt create mode 100644 base/errno_h.jl.cmake create mode 100644 cmake/CatFiles.cmake create mode 100644 cmake/JuliaCCompiler.cmake create mode 100644 cmake/JuliaDeps.cmake create mode 100644 cmake/JuliaDirs.cmake create mode 100644 cmake/JuliaFortranCompiler.cmake create mode 100644 cmake/JuliaOptions.cmake create mode 100644 cmake/JuliaUtils.cmake create mode 100644 cmake/JuliaVersion.cmake create mode 100644 cmake/jl_custom_target.cmake create mode 100644 contrib/CMakeLists.txt create mode 100644 deps/CMakeLists.txt delete mode 100644 deps/Versions.make create mode 100644 doc/CMakeLists.txt create mode 100644 src/CMakeLists.txt delete mode 100644 src/Makefile create mode 100644 src/flisp/CMakeLists.txt delete mode 100644 src/flisp/Makefile create mode 100644 src/julia-config-p.h.in create mode 100644 src/julia-config.h.in create mode 100644 src/support/CMakeLists.txt delete mode 100644 src/support/Makefile create mode 100644 test/CMakeLists.txt create mode 100644 ui/CMakeLists.txt delete mode 100644 ui/Makefile diff --git a/.gitignore b/.gitignore index bf6db98714fdb..5911dc37eca4f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /julia-* /source-dist.tmp /source-dist.tmp1 +/build* *.exe *.dll diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000000..ddd0d430c7ce5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,287 @@ +project(Julia C CXX) + +## Setup cmake paths +cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) +set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include(JuliaUtils) + +# Utilities for defining options +include(JuliaOptions) + +# Set versions +include(JuliaVersion) + +# Architecture and compiler/flags +jl_str_option(ARCH "" "") +jl_set_option(JL_IS_MINGW "${MINGW}") +jl_set_option(JL_IS_MSYS "${MSYS}") + +include(JuliaDirs) +include(JuliaCCompiler) + +# TODO only enable if necessary +# enable_language(Fortran) +# include(JuliaFortranCompiler) + +# OPENBLAS build options +jl_str_option(OPENBLAS_TARGET_ARCH "OpenBLAS Arch" "") +jl_str_option(OPENBLAS_SYMBOLSUFFIX "OpenBLAS symbol suffix" "") + +# If OPENBLAS_TARGET_ARCH is set, we default to disabling OPENBLAS_DYNAMIC_ARCH +if(OPENBLAS_TARGET_ARCH STREQUAL "") + jl_option(OPENBLAS_DYNAMIC_ARCH "" Off) +else() + jl_option(OPENBLAS_DYNAMIC_ARCH "" On) +endif() +jl_option(OPENBLAS_USE_THREAD "" On) + +# use_system options +use_system_opt(LLVM) +use_system_opt(LIBUNWIND) +use_system_opt(PCRE) +use_system_opt(LIBM) +use_system_opt(OPENLIBM) +jl_option(UNTRUSTED_SYSTEM_LIBM "Do not trust system libm" Off) +use_system_opt(OPENSPECFUN) +use_system_opt(DSFMT) +use_system_opt(BLAS) +use_system_opt(LAPACK) +use_system_opt(FFTW) +use_system_opt(GMP) +use_system_opt(MPFR) +use_system_opt(ARPACK) +use_system_opt(SUITESPARSE) +use_system_opt(RMATH) +use_system_opt(LIBUV) +use_system_opt(UTF8PROC) +use_system_opt(LIBGIT2) +use_system_opt(PATCHELF) + +jl_option(USE_GPL_LIBS "Whether to use GPL libraries or not." On) + +# LLVM related options +jl_option(USE_LLVM_SHLIB "Link to the LLVM shared library" Off) +jl_option(LLVM_ASSERTIONS "" Off) +jl_option(LLVM_DEBUG "" Off) +# Enable to get lldb (often does not work, no chance with llvm3.2 and earlier) +# see http://lldb.llvm.org/build.html for dependencies +jl_option(BUILD_LLDB "Build lldb" Off) +jl_option(BUILD_LLVM_CLANG "Build clang and compiler-rt" ${BUILD_LLDB}) + +option(USE_COPY_STACKS "" On) + +include(JuliaDeps) + +## Settings for various Intel tools +jl_option(USE_INTEL_MKL "Use MKL" Off) +jl_option(USE_INTEL_MKL_FFT "Use MKL FFT" Off) +jl_option(USE_INTEL_LIBM "Use Intel LIBM" Off) +jl_option(USE_INTEL_JITEVENTS + "Enable profiling with Intel VTune Amplifier" Off) + +jl_set_make_flag(CMAKE "${CMAKE_COMMAND}") + +set(JL_SYSTEM_IMAGE_PATH + "${build_private_libdir_rel}/sys${CMAKE_SHARED_LIBRARY_SUFFIX}") + +configure_file(src/julia-config.h.in include/julia/julia-config.h @ONLY) +configure_file(src/julia-config-p.h.in include/julia/julia-config-p.h @ONLY) + +# This is the trick in cmake to have proper dependency on a file +# For another command that depend on the output of this which needs to be +# updated automatically. The (custom) command should depend on the file output +# and the corresponding (custom) target should depend on this target. +if(WIN32 OR CYGWIN) + add_custom_command(OUTPUT "${build_sysconfdir}/julia/juliarc.jl" + COMMAND "${CMAKE_COMMAND}" + "-DNSRC=2" "-DSRC1=${CMAKE_SOURCE_DIR}/etc/juliarc.jl" + "-DSRC2=${CMAKE_SOURCE_DIR}/contrib/windows/juliarc.jl" + "-DDST=${build_sysconfdir}/julia/juliarc.jl" + -P "${CMAKE_SOURCE_DIR}/cmake/CatFiles.cmake" + DEPENDS etc/juliarc.jl contrib/windows/juliarc.jl + "${CMAKE_SOURCE_DIR}/cmake/CatFiles.cmake") +elseif(APPLE) + add_custom_command(OUTPUT "${build_sysconfdir}/julia/juliarc.jl" + COMMAND "${CMAKE_COMMAND}" + "-DNSRC=2" "-DSRC1=${CMAKE_SOURCE_DIR}/etc/juliarc.jl" + "-DSRC2=${CMAKE_SOURCE_DIR}/contrib/mac/juliarc.jl" + "-DDST=${build_sysconfdir}/julia/juliarc.jl" + -P "${CMAKE_SOURCE_DIR}/cmake/CatFiles.cmake" + DEPENDS etc/juliarc.jl contrib/mac/juliarc.jl + "${CMAKE_SOURCE_DIR}/cmake/CatFiles.cmake") +else() + add_custom_command(OUTPUT "${build_sysconfdir}/julia/juliarc.jl" + COMMAND "${CMAKE_COMMAND}" -E copy + "${CMAKE_SOURCE_DIR}/etc/juliarc.jl" + "${build_sysconfdir}/julia/juliarc.jl" + DEPENDS etc/juliarc.jl) +endif() + +add_custom_target(juliarc-jl + DEPENDS "${build_sysconfdir}/julia/juliarc.jl") + +add_custom_command(OUTPUT "${build_man1dir}/julia.1" + COMMAND "${CMAKE_COMMAND}" -E copy + "${CMAKE_SOURCE_DIR}/doc/man/julia.1" + "${build_man1dir}/julia.1" + DEPENDS doc/man/julia.1) + +add_custom_target(julia-man1 + DEPENDS "${build_man1dir}/julia.1") + +# Intel VTune Amplifier +if(USE_INTEL_JITEVENTS) + push_c_flags(JLCPP_FLAGS -DJL_USE_INTEL_JITEVENTS) +endif() + +# TODO +if(USE_SYSTEM_LIBUV) + set(LIBUV /usr/lib/libuv-julia.a) + set(LIBUV_INC /usr/include) +else() + set(LIBUV "${build_libdir}/libuv.a") + set(LIBUV_INC "${build_includedir}") +endif() + +jl_set_make_flag(LIBUV "${LIBUV}") +jl_set_make_flag(LIBUV_INC "${LIBUV_INC}") + +if(USE_SYSTEM_UTF8PROC) + set(LIBUTF8PROC -lutf8proc) + set(UTF8PROC_INC /usr/include) +else() + set(LIBUTF8PROC "${build_libdir}/libutf8proc.a") + set(UTF8PROC_INC "${build_includedir}") +endif() + +if(USE_SYSTEM_LLVM) + set(LLVM_CONFIG "llvm-config${CMAKE_EXECUTABLE_SUFFIX}") + add_definitions(-DSYSTEM_LLVM) +else() + set(LLVM_CONFIG "${build_bindir}/llvm-config${CMAKE_EXECUTABLE_SUFFIX}") +endif() + +jl_set_make_flag(LLVM_CONFIG "${LLVM_CONFIG}") + +# TODO FindLLVM +execute_process(COMMAND "${LLVM_CONFIG}" --includedir + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_INC) +execute_process(COMMAND "${LLVM_CONFIG}" --ldflags + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_LDFLAGS) +execute_process(COMMAND "${LLVM_CONFIG}" --libs + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_LIBS) +execute_process(COMMAND "${LLVM_CONFIG}" --system-libs + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_SYSTEMLIBS) +execute_process(COMMAND "${LLVM_CONFIG}" --version + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_VERSION) +execute_process(COMMAND "${LLVM_CONFIG}" --cxxflags + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE LLVM_CXXFLAGS) + +if(APPLE) + set(WHOLE_ARCHIVE "-Xlinker -all_load") + set(NO_WHOLE_ARCHIVE) +elseif(NOT USEMSVC) + set(WHOLE_ARCHIVE "-Wl,--whole-archive") + set(NO_WHOLE_ARCHIVE "-Wl,--no-whole-archive") +endif() + +jl_set_make_flag(WHOLE_ARCHIVE "${WHOLE_ARCHIVE}") +jl_set_make_flag(NO_WHOLE_ARCHIVE "${NO_WHOLE_ARCHIVE}") + +if(WIN32) + push_c_flags(LIBUNWIND) +elseif(USE_SYSTEM_LIBUNWIND) + if(NOT APPLE) + push_c_flags(LIBUNWIND -lunwind-generic -lunwind) + endif() +elseif(APPLE) + push_c_flags(LIBUNWIND ${build_libdir}/libosxunwind.a) + add_definitions(-DLIBOSXUNWIND) +else() + push_c_flags(LIBUNWIND ${build_libdir}/libunwind-generic.a + ${build_libdir}/libunwind.a) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + push_c_flags(OSLIBS -ldl -lrt -lpthread -Wl,--export-dynamic + -Wl,--no-whole-archive ${LIBUNWIND}) + # TODO + if(NOT SANITIZE AND NOT SANITIZE_MEMORY AND NOT LLVM_SANITIZE) + push_c_flags(-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/julia.expmap) + endif() + push_c_flags(JL_LD_FLAGS -Wl,-Bdynamic) + # TODO try compile? + push_c_flags(CMAKE_SHARED_LINKER_FLAGS -Wl,-Bsymbolic-functions) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + push_c_flags(JL_LD_FLAGS -Wl,-Bdynamic) + push_c_flags(OSLIBS -lkvm -lrt -Wl,--export-dynamic + -Wl,--version-script=${CMAKE_SOURCE_DIR}/src/julia.expmap + ${NO_WHOLE_ARCHIVE} ${LIBUNWIND}) +endif() + +if(APPLE) + push_c_flags(OSLIBS -ldl -Wl,-w -framework CoreFoundation + -framework CoreServices ${LIBUNWIND}) + set(HAVE_SSP On) +endif() + +if(WIN32) + if(NOT USEMSVC) + set(HAVE_SSP On) + push_c_flags(OSLIBS -Wl,--export-all-symbols + -Wl,--version-script=${CMAKE_SOURCE_DIR}/src/julia.expmap + ${NO_WHOLE_ARCHIVE} -lpsapi -lkernel32 -lws2_32 -liphlpapi -lwinmm + -ldbghelp) + push_c_flags(JL_LD_FLAGS, -Wl,--stack,8388608) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + push_c_flags(JL_LD_FLAGS -Wl,--large-address-aware) + endif() + else() #USEMSVC + push_c_flags(OSLIBS kernel32.lib ws2_32.lib psapi.lib advapi32.lib + iphlpapi.lib shell32.lib winmm.lib) + push_c_flags(JL_LD_FLAGS -stack:8388608) + endif() + add_definitions(-D_WIN32_WINNT=0x0502) + set(UNTRUSTED_SYSTEM_LIBM On CACHE INTERNAL "" FORCE) + jl_set_option(UNTRUSTED_SYSTEM_LIBM On) +endif() + +if(HAVE_SSP) + add_definitions(-DHAVE_SSP=1) + if(USEGCC) + push_c_flags(OSLIBS -lssp) + endif() +endif() + +jl_set_make_flag(CC "${CMAKE_C_COMPILER}") +jl_set_make_flag(CXX "${CMAKE_CXX_COMPILER}") +string(SUBSTRING "${CMAKE_SHARED_LIBRARY_SUFFIX}" 1 -1 SHLIB) +jl_set_make_flag(SHLIB_EXT "${SHLIB}") + +jl_get_make_flags(jl_make_flags) + +# message("${jl_make_flags}") + +add_subdirectory(deps) +add_subdirectory(test) +add_subdirectory(contrib) +add_subdirectory(src) +add_subdirectory(doc) +add_subdirectory(ui) +add_subdirectory(base) + +add_custom_target(julia ALL + DEPENDS libccalltest stringreplace julia-ui julia_symlink julia-inference-so + julia-errno_h.jl + COMMAND make ${jl_make_flags} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/Make.inc b/Make.inc index 9d53de96ddae1..06d72d422b209 100644 --- a/Make.inc +++ b/Make.inc @@ -1,222 +1,16 @@ # -*- mode: makefile-gmake -*- -## Note: -## It is generally preferable to change these options, for -## your local machine, in a file named `Make.user` in this directory - -# OPENBLAS build options -OPENBLAS_TARGET_ARCH= -OPENBLAS_SYMBOLSUFFIX= - -# If OPENBLAS_TARGET_ARCH is set, we default to disabling OPENBLAS_DYNAMIC_ARCH -ifneq ($(OPENBLAS_TARGET_ARCH),) -OPENBLAS_DYNAMIC_ARCH=0 -else -OPENBLAS_DYNAMIC_ARCH=1 -endif -OPENBLAS_USE_THREAD=1 - -# Use libraries available on the system instead of building them -USE_SYSTEM_LLVM=0 -USE_SYSTEM_LIBUNWIND=0 -USE_SYSTEM_PCRE=0 -USE_SYSTEM_LIBM=0 -USE_SYSTEM_OPENLIBM=0 -UNTRUSTED_SYSTEM_LIBM=0 -USE_SYSTEM_OPENSPECFUN=0 -USE_SYSTEM_DSFMT=0 -USE_SYSTEM_BLAS=0 -USE_SYSTEM_LAPACK=0 -USE_SYSTEM_FFTW=0 -USE_SYSTEM_GMP=0 -USE_SYSTEM_MPFR=0 -USE_SYSTEM_ARPACK=0 -USE_SYSTEM_SUITESPARSE=0 -USE_SYSTEM_LIBUV=0 -USE_SYSTEM_UTF8PROC=0 -USE_SYSTEM_LIBGIT2=0 -USE_SYSTEM_PATCHELF=0 - -# Link to the LLVM shared library -USE_LLVM_SHLIB = 0 - -## Settings for various Intel tools -# Set to 1 to use MKL -USE_INTEL_MKL ?= 0 -# Set to 1 to use MKL FFT -USE_INTEL_MKL_FFT ?= 0 -# Set to 1 to use Intel LIBM -USE_INTEL_LIBM ?= 0 -# Set to 1 to enable profiling with Intel VTune Amplifier -USE_INTEL_JITEVENTS ?= 0 -# Set to 1 to use Intel C, C++, and FORTRAN compilers -USEICC ?= 0 -USEIFC ?= 0 - -ifeq ($(USE_MKL), 1) -$(warning "The julia make variable USE_MKL has been renamed to USE_INTEL_MKL") -USE_INTEL_MKL = 1 -endif - -# libc++ is standard on OS X 10.9, but not for earlier releases -USE_LIBCPP = 0 - -# assume we don't have LIBSSP support in our compiler, will enable later if likely true -HAVE_SSP = 0 - -# Prevent picking up $ARCH from the environment variables -ARCH= - -# we include twice to pickup user definitions better -ifeq (exists, $(shell [ -e $(JULIAHOME)/Make.user ] && echo exists )) -include $(JULIAHOME)/Make.user -endif - # disable automatic Makefile rules .SUFFIXES: -# find out if git repository is available -ifeq ($(shell [ -e $(JULIAHOME)/.git ] && echo true || echo "Warning: git information unavailable; versioning information limited" >&2), true) -NO_GIT = 0 -else -NO_GIT = 1 -endif - -JULIA_VERSION = $(shell cat $(JULIAHOME)/VERSION) -ifneq ($(NO_GIT), 1) -JULIA_COMMIT = $(shell git rev-parse --short=10 HEAD) -else -JULIA_COMMIT = $(JULIA_VERSION) -endif - -# Whether to use GPL libraries or not. -USE_GPL_LIBS ?= 1 - -# Directories where said libraries get installed to -prefix ?= $(abspath julia-$(JULIA_COMMIT)) -bindir = $(prefix)/bin -libdir = $(prefix)/lib -private_libdir = $(libdir)/julia -libexecdir = $(prefix)/libexec -datarootdir = $(prefix)/share -docdir = $(datarootdir)/doc/julia -mandir = $(datarootdir)/man -man1dir = $(mandir)/man1 -includedir = $(prefix)/include -sysconfdir = $(prefix)/etc - -# Directories where things get built into -build_prefix = $(JULIAHOME)/usr -build_staging = $(build_prefix)-staging -build_bindir = $(build_prefix)/bin -build_libdir = $(build_prefix)/lib -build_private_libdir = $(build_prefix)/lib/julia -build_libexecdir = $(build_prefix)/libexec -build_datarootdir = $(build_prefix)/share -build_docdir = $(build_datarootdir)/doc/julia -build_mandir = $(build_datarootdir)/man -build_man1dir = $(build_mandir)/man1 -build_includedir = $(build_prefix)/include -build_sysconfdir = $(build_prefix)/etc - - -# Calculate relative paths to libdir, private_libdir, datarootdir, and sysconfdir -build_libdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(build_bindir) $(build_libdir)) -libdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(bindir) $(libdir)) -build_private_libdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(build_bindir) $(build_private_libdir)) -private_libdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(bindir) $(private_libdir)) -datarootdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(bindir) $(datarootdir)) -docdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(bindir) $(docdir)) -sysconfdir_rel = $(shell $(JULIAHOME)/contrib/relative_path.sh $(bindir) $(sysconfdir)) - -INSTALL_F = $(JULIAHOME)/contrib/install.sh 644 -INSTALL_M = $(JULIAHOME)/contrib/install.sh 755 - -# This used for debian packaging, to conform to library layout guidelines -ifeq ($(MULTIARCH_INSTALL), 1) -MULTIARCH = $(shell gcc -print-multiarch) -private_libdir = $(prefix)/lib/$(MULTIARCH)/julia -libdir = $(prefix)/lib/$(MULTIARCH)/ -endif - -# LLVM Options -LLVMROOT = $(build_prefix) -LLVM_ASSERTIONS = 0 -LLVM_DEBUG = 0 -# set to 1 to get clang and compiler-rt -BUILD_LLVM_CLANG = 0 -# set to 1 to get lldb (often does not work, no chance with llvm3.2 and earlier) -# see http://lldb.llvm.org/build.html for dependencies -BUILD_LLDB = 0 - -# Cross-compile -#XC_HOST = i686-w64-mingw32 -#XC_HOST = x86_64-w64-mingw32 - -# Path to cmake (override in Make.user if needed) -CMAKE ?= cmake - # Figure out OS and architecture BUILD_OS := $(shell uname) -ifneq (,$(findstring CYGWIN,$(BUILD_OS))) -XC_HOST ?= $(shell uname -m)-w64-mingw32 -endif - -ifeq ($(XC_HOST),) -CROSS_COMPILE= HOSTCC = $(CC) -else -HOSTCC = gcc -override OPENBLAS_DYNAMIC_ARCH = 1 -override CROSS_COMPILE=$(XC_HOST)- -ifneq (,$(findstring mingw,$(XC_HOST))) -override OS := WINNT -ifneq (,$(findstring CYGWIN,$(BUILD_OS))) -export STD_LIB_PATH := $(shell $(CROSS_COMPILE)gcc -print-search-dirs | grep programs | sed -e "s/^programs: =//" -e "s!/lib/!/bin/!g") -export STD_LIB_PATH := $(STD_LIB_PATH):$(shell $(CROSS_COMPILE)gcc -print-search-dirs | grep libraries | sed -e "s/^libraries: =//" -e "s!/lib/!/bin/!g") -else -export STD_LIB_PATH := $(shell $(CROSS_COMPILE)gcc -print-search-dirs | grep programs | sed "s/^programs: =//" | xargs -d":" winepath -w | tr '\n' ';') -export STD_LIB_PATH := $(STD_LIB_PATH);$(shell $(CROSS_COMPILE)gcc -print-search-dirs | grep libraries | sed "s/^libraries: =//" | xargs -d":" winepath -w | tr '\n' ';') -endif -else -$(error "unknown XC_HOST variable set") -endif -endif - -JLDOWNLOAD = $(JULIAHOME)/deps/jldownload -JLCHECKSUM = $(JULIAHOME)/deps/jlchecksum # Figure out OS and architecture OS := $(BUILD_OS) -ifneq (,$(findstring MINGW,$(OS))) -override OS := WINNT -endif -ifneq (,$(findstring MINGW,$(BUILD_OS))) -override BUILD_OS := WINNT -endif -ifneq (,$(findstring MSYS,$(OS))) -override OS := WINNT -endif -ifneq (,$(findstring MSYS,$(BUILD_OS))) -override BUILD_OS := WINNT -endif - -ifeq ($(OS), WINNT) -fPIC = -ifeq ($(BUILD_OS), WINNT) -PATH := $(PATH):$(build_libdir):$(build_private_libdir):/c/Program Files/7-zip -endif -EXE = .exe -else -fPIC = -fPIC -EXE = -endif - -JULIAGC = MARKSWEEP -USE_COPY_STACKS = 1 - # flag for disabling assertions ifeq ($(FORCE_ASSERTIONS), 1) DISABLE_ASSERTIONS = @@ -226,141 +20,25 @@ endif # Compiler specific stuff -ifeq ($(USEMSVC), 1) -USEGCC = 0 -USECLANG = 0 -USEICC = 0 -else -ifeq ($(USECLANG), 1) -USEGCC = 0 -USEICC = 0 -else -ifeq ($(USEICC), 1) -USEGCC = 0 -USECLANG = 0 -else # default to gcc -USEGCC = 1 -USECLANG = 0 -USEICC = 0 -endif -endif -endif - ifeq ($(USEIFC), 1) FC = ifort else -FC = $(CROSS_COMPILE)gfortran -endif - -STDLIBCPP_FLAG = - -ifeq ($(OS), Darwin) -DARWINVER := $(shell uname -r | cut -b 1-2) -DARWINVER_GTE13 := $(shell expr `uname -r | cut -b 1-2` \>= 13) -ifeq ($(DARWINVER), 10) # Snow Leopard specific configuration -USEGCC = 1 -USECLANG = 0 -OPENBLAS_TARGET_ARCH=NEHALEM -OPENBLAS_DYNAMIC_ARCH=0 -USE_SYSTEM_LIBUNWIND=1 -else -ifeq ($(DARWINVER_GTE13),1) -USE_LIBCPP = 1 -STDLIBCPP_FLAG = -stdlib=libstdc++ -else -USE_LIBCPP = 0 -endif -USEGCC = 0 -USECLANG = 1 -endif -endif - -ifeq ($(USEGCC),1) -ifeq ($(USE_LIBCPP),1) -$(error USE_LIBCPP only supported with clang. Try setting USE_LIBCPP=0) -endif -ifeq ($(SANITIZE),1) -$(error Address Sanitizer only supported with clang. Try setting SANITIZE=0) -endif -CC = $(CROSS_COMPILE)gcc -CXX = $(CROSS_COMPILE)g++ -JCFLAGS = -std=gnu99 -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -JCPPFLAGS = -JCXXFLAGS = -pipe $(fPIC) -fno-rtti -DEBUGFLAGS = -O0 -ggdb3 -DJL_DEBUG_BUILD -fstack-protector-all -SHIPFLAGS = -O3 -ggdb3 -falign-functions +FC = gfortran endif ifeq ($(USECLANG),1) -CC = $(CROSS_COMPILE)clang -CXX = $(CROSS_COMPILE)clang++ -JCFLAGS = -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -JCPPFLAGS = -JCXXFLAGS = -pipe $(fPIC) -fno-rtti -DEBUGFLAGS = -O0 -g -DJL_DEBUG_BUILD -fstack-protector-all -SHIPFLAGS = -O3 -g ifeq ($(OS), Darwin) ifeq ($(USE_LIBCPP), 1) -CC += -stdlib=libc++ -mmacosx-version-min=10.7 -CXX += -stdlib=libc++ -mmacosx-version-min=10.7 -FC += -mmacosx-version-min=10.7 -else -CC += $(STDLIBCPP_FLAG) -mmacosx-version-min=10.6 -CXX += $(STDLIBCPP_FLAG) -mmacosx-version-min=10.6 -endif -JCPPFLAGS += -D_LARGEFILE_SOURCE -D_DARWIN_USE_64_BIT_INODE=1 -endif -endif - -ifeq ($(USEICC),1) -ifeq ($(USE_LIBCPP),1) -$(error USE_LIBCPP only supported with clang. Try setting USE_LIBCPP=0) -endif -ifeq ($(SANITIZE),1) -$(error Address Sanitizer only supported with clang. Try setting SANITIZE=0) -endif -CC = icc -CXX = icpc -JCFLAGS = -std=gnu99 -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -fp-model precise -fp-model except -no-ftz -JCPPFLAGS = -JCXXFLAGS = -pipe $(fPIC) -fno-rtti -DEBUGFLAGS = -O0 -g -DJL_DEBUG_BUILD -fstack-protector-all -SHIPFLAGS = -O3 -g -falign-functions -endif - -ifeq ($(USECCACHE), 1) -# expand CC and CXX at declaration time because we will redefine them -CC_ARG := $(CC) # Expand CC and CXX here already because we want -CXX_ARG := $(CXX) # the original definition and not the ccache version. -CC_FULL := ccache $(CC) # Expand CC and CXX here already to avoid recursive -CXX_FULL := ccache $(CXX) # referencing. -CC = $(CC_FULL) # Add an extra indirection to make CC/CXX non-simple -CXX = $(CXX_FULL) # vars (because of how -m$(BINARY) is added later on). -CC_BASE = ccache -CXX_BASE = ccache -ifeq ($(USECLANG),1) -# ccache and Clang don't do well together -# http://petereisentraut.blogspot.be/2011/05/ccache-and-clang.html -CC += -Qunused-arguments -fcolor-diagnostics -CXX += -Qunused-arguments -fcolor-diagnostics -# http://petereisentraut.blogspot.be/2011/09/ccache-and-clang-part-2.html -export CCACHE_CPP2 := yes +override FC += -mmacosx-version-min=10.7 endif -else #USECCACHE -CC_BASE = $(shell echo $(CC) | cut -d' ' -f1) -CXX_BASE = $(shell echo $(CXX) | cut -d' ' -f1) endif - -ifeq ($(LLVM_VER),svn) -JCXXFLAGS += -std=c++11 endif -JFFLAGS = -O2 $(fPIC) ifneq ($(USEMSVC),1) CPP = $(CC) -E -AR := $(CROSS_COMPILE)ar -AS := $(CROSS_COMPILE)as -LD := $(CROSS_COMPILE)ld +AR := ar +AS := as +LD := ld else #USEMSVC CPP = $(CC) -EP AR := lib @@ -371,31 +49,6 @@ AS := ml endif #ARCH LD := link endif #USEMSVC -RANLIB := $(CROSS_COMPILE)ranlib - -# file extensions -ifeq ($(OS), WINNT) - SHLIB_EXT = dll -else ifeq ($(OS), Darwin) - SHLIB_EXT = dylib -else - SHLIB_EXT = so -endif - - -# if not absolute, then relative to the directory of the julia executable -JCPPFLAGS += "-DJL_SYSTEM_IMAGE_PATH=\"$(build_private_libdir_rel)/sys.$(SHLIB_EXT)\"" - -# On Windows, we want shared library files to end up in $(build_bindir), instead of $(build_libdir) -ifeq ($(OS),WINNT) -build_shlibdir = $(build_bindir) -else -build_shlibdir = $(build_libdir) -endif - -ifeq (exists, $(shell [ -e $(JULIAHOME)/Make.user ] && echo exists )) -include $(JULIAHOME)/Make.user -endif ifeq ($(SANITIZE),1) ifeq ($(SANITIZE_MEMORY),1) @@ -403,19 +56,11 @@ SANITIZE_OPTS = -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-fram else SANITIZE_OPTS = -fsanitize=address -mllvm -asan-stack=0 endif -JCXXFLAGS += $(SANITIZE_OPTS) -JCFLAGS += $(SANITIZE_OPTS) +override JCXXFLAGS += $(SANITIZE_OPTS) +override JCFLAGS += $(SANITIZE_OPTS) LDFLAGS += $(SANITIZE_OPTS) -DEPS_CFLAGS += $(SANITIZE_OPTS) -DEPS_CXXFLAGS += $(SANITIZE_OPTS) -endif - -TAR=`which gtar 2>/dev/null || which tar 2>/dev/null` -TAR_TEST := $(shell $(TAR) --help 2>&1 | egrep 'bsdtar|strip-components') -ifeq (,$(findstring components,$(TAR_TEST))) -ifneq (bsdtar,$(findstring bsdtar,$(TAR_TEST))) -$(error "please install either GNU tar or bsdtar") -endif +override DEPS_CFLAGS += $(SANITIZE_OPTS) +override DEPS_CXXFLAGS += $(SANITIZE_OPTS) endif # =========================================================================== @@ -522,7 +167,7 @@ endif # If we are running on ARM, set certain options automatically ifneq (,$(findstring arm,$(ARCH))) -JCFLAGS += -fsigned-char +override JCFLAGS += -fsigned-char LLVM_ASSERTIONS=1 #LLVM_FLAGS+="--with-float=hard --with-abi=aapcs-vfp" @@ -547,33 +192,12 @@ endif ifeq ($(USEGCC),1) ifeq ($(ISX86),1) - SHIPFLAGS += -momit-leaf-frame-pointer -endif -endif - -ifeq ($(OS),WINNT) -LIBUNWIND= -else -ifeq ($(USE_SYSTEM_LIBUNWIND), 1) -ifneq ($(OS),Darwin) -LIBUNWIND=-lunwind-generic -lunwind -endif -else -ifeq ($(OS),Darwin) -LIBUNWIND=$(build_libdir)/libosxunwind.a -JCPPFLAGS+=-DLIBOSXUNWIND -else -LIBUNWIND=$(build_libdir)/libunwind-generic.a $(build_libdir)/libunwind.a -endif + override SHIPFLAGS += -momit-leaf-frame-pointer endif endif ifeq ($(USE_SYSTEM_LLVM), 1) -LLVM_CONFIG ?= llvm-config$(EXE) -JCPPFLAGS+=-DSYSTEM_LLVM LLVM_VER = $(shell $(LLVM_CONFIG) --version) -else -LLVM_CONFIG=$(build_bindir)/llvm-config$(EXE) endif ifeq ($(USE_SYSTEM_PCRE), 1) @@ -641,22 +265,6 @@ LIBM = -lopenlibm LIBMNAME = libopenlibm endif -ifeq ($(USE_SYSTEM_LIBUV), 1) - LIBUV = /usr/lib/libuv-julia.a - LIBUV_INC = /usr/include -else - LIBUV = $(build_libdir)/libuv.a - LIBUV_INC = $(build_includedir) -endif - -ifeq ($(USE_SYSTEM_UTF8PROC), 1) - LIBUTF8PROC = -lutf8proc - UTF8PROC_INC = /usr/include -else - LIBUTF8PROC = $(build_libdir)/libutf8proc.a - UTF8PROC_INC = $(build_includedir) -endif - # OS specific stuff # install_name_tool @@ -689,74 +297,12 @@ else RPATH_ORIGIN = -Wl,-rpath,'$$ORIGIN' -Wl,-z,origin endif -# --whole-archive -ifeq ($(OS), Darwin) - WHOLE_ARCHIVE = -Xlinker -all_load - NO_WHOLE_ARCHIVE = -else ifneq ($(USEMSVC), 1) - WHOLE_ARCHIVE = -Wl,--whole-archive - NO_WHOLE_ARCHIVE = -Wl,--no-whole-archive -endif - -ifeq ($(OS), Linux) -OSLIBS += -ldl -lrt -lpthread -Wl,--export-dynamic -Wl,--no-whole-archive $(LIBUNWIND) -ifneq ($(SANITIZE),1) -ifneq ($(SANITIZE_MEMORY),1) -ifneq ($(LLVM_SANITIZE),1) -OSLIBS += -Wl,--version-script=$(JULIAHOME)/src/julia.expmap -endif -endif -endif -JLDFLAGS = -Wl,-Bdynamic -ifeq (-Bsymbolic-functions, $(shell $(LD) --help | grep -o -e "-Bsymbolic-functions")) -JLIBLDFLAGS = -Wl,-Bsymbolic-functions -else -JLIBLDFLAGS = -endif -else #Linux -JLIBLDFLAGS = -endif - -ifeq ($(OS), FreeBSD) -JLDFLAGS = -Wl,-Bdynamic -OSLIBS += -lkvm -lrt -Wl,--export-dynamic -Wl,--version-script=$(JULIAHOME)/src/julia.expmap $(NO_WHOLE_ARCHIVE) $(LIBUNWIND) -endif - ifeq ($(OS), Darwin) INSTALL_NAME_CMD = install_name_tool -id $(INSTALL_NAME_ID_DIR) INSTALL_NAME_CHANGE_CMD = install_name_tool -change -SHLIB_EXT = dylib -OSLIBS += -ldl -Wl,-w -framework CoreFoundation -framework CoreServices $(LIBUNWIND) -WHOLE_ARCHIVE = -Xlinker -all_load -NO_WHOLE_ARCHIVE = -JLDFLAGS = -HAVE_SSP = 1 -endif - -ifeq ($(OS), WINNT) -ifneq ($(USEMSVC), 1) -HAVE_SSP = 1 -OSLIBS += -Wl,--export-all-symbols -Wl,--version-script=$(JULIAHOME)/src/julia.expmap \ - $(NO_WHOLE_ARCHIVE) -lpsapi -lkernel32 -lws2_32 -liphlpapi -lwinmm -ldbghelp -JLDFLAGS = -Wl,--stack,8388608 -ifeq ($(ARCH),i686) -JLDFLAGS += -Wl,--large-address-aware -endif -else #USEMSVC -OSLIBS += kernel32.lib ws2_32.lib psapi.lib advapi32.lib iphlpapi.lib shell32.lib winmm.lib -JLDFLAGS = -stack:8388608 -endif -JCPPFLAGS += -D_WIN32_WINNT=0x0502 -UNTRUSTED_SYSTEM_LIBM = 1 -endif - -# Intel VTune Amplifier -ifeq ($(USE_INTEL_JITEVENTS), 1) -JCPPFLAGS += -DJL_USE_INTEL_JITEVENTS endif # Intel libraries - ifeq ($(USE_INTEL_LIBM), 1) USE_SYSTEM_LIBM = 1 LIBM = -L$(MKLROOT)/../compiler/lib/intel64 -limf @@ -792,13 +338,6 @@ LIBFFTWNAME = libmkl_rt LIBFFTWFNAME = libmkl_rt endif -ifeq ($(HAVE_SSP),1) -JCPPFLAGS += -DHAVE_SSP=1 -ifeq ($(USEGCC),1) -OSLIBS += -lssp -endif -endif - # ATLAS # ATLAS must have been previously built with "make -C deps compile-atlas" (without -jN), diff --git a/Makefile b/Makefile index 30e59f5ab69e4..ae90c7b058997 100644 --- a/Makefile +++ b/Makefile @@ -1,139 +1,30 @@ -JULIAHOME = $(abspath .) include $(JULIAHOME)/Make.inc -# TODO: Code bundled with Julia should be installed into a versioned directory, -# prefix/share/julia/VERSDIR, so that in the future one can have multiple -# major versions of Julia installed concurrently. Third-party code that -# is not controlled by Pkg should be installed into -# prefix/share/julia/site/VERSDIR (not prefix/share/julia/VERSDIR/site ... -# so that prefix/share/julia/VERSDIR can be overwritten without touching -# third-party code). -VERSDIR = v`cut -d. -f1-2 < VERSION` - -#file name of make binary-dist result -ifeq ($(JULIA_BINARYDIST_TARNAME),) - JULIA_BINARYDIST_TARNAME = julia-$(JULIA_COMMIT)-$(OS)-$(ARCH) -endif - default: $(JULIA_BUILD_MODE) # contains either "debug" or "release" all: debug release -# sort is used to remove potential duplicates -DIRS = $(sort $(build_bindir) $(build_libdir) $(build_private_libdir) $(build_libexecdir) $(build_sysconfdir)/julia $(build_datarootdir)/julia $(build_man1dir)) - -$(foreach dir,$(DIRS),$(eval $(call dir_target,$(dir)))) $(foreach link,base test,$(eval $(call symlink_target,$(link),$(build_datarootdir)/julia))) -# Build the HTML docs (skipped if already exists, notably in tarballs) -doc/_build/html: - @$(MAKE) -C doc html - # doc needs to live under $(build_docdir), not under $(build_datarootdir)/julia/ -CLEAN_TARGETS += clean-$(build_docdir) -clean-$(build_docdir): - @-rm -fr $(abspath $(build_docdir)) $(subst $(abspath $(JULIAHOME))/,,$(abspath $(build_docdir))): $(build_docdir) $(build_docdir): @mkdir -p $@/examples @cp -R examples/*.jl $@/examples/ @cp -R examples/clustermanager $@/examples/ -julia-symlink: julia-ui-$(JULIA_BUILD_MODE) -ifneq ($(OS),WINNT) -ifndef JULIA_VAGRANT_BUILD - @ln -sf "$(shell contrib/relative_path.sh "$(JULIAHOME)" "$(JULIA_EXECUTABLE)")" julia -endif -endif - -julia-deps: | $(DIRS) $(build_datarootdir)/julia/base $(build_datarootdir)/julia/test $(build_docdir) $(build_sysconfdir)/julia/juliarc.jl $(build_man1dir)/julia.1 - @$(MAKE) $(QUIET_MAKE) -C deps - -julia-base: julia-deps +julia-base: @$(MAKE) $(QUIET_MAKE) -C base -julia-libccalltest: - @$(MAKE) $(QUIET_MAKE) -C test libccalltest - -julia-src-release julia-src-debug : julia-src-% : julia-deps - @$(MAKE) $(QUIET_MAKE) -C src libjulia-$* - -julia-ui-release julia-ui-debug : julia-ui-% : julia-src-% - @$(MAKE) $(QUIET_MAKE) -C ui julia-$* - -julia-sysimg : julia-base julia-ui-$(JULIA_BUILD_MODE) +julia-sysimg : julia-base @$(MAKE) $(QUIET_MAKE) $(build_private_libdir)/sys.$(SHLIB_EXT) JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) -julia-debug julia-release : julia-% : julia-ui-% julia-symlink julia-sysimg julia-libccalltest +julia-debug julia-release : julia-% : julia-sysimg debug release : % : julia-% -check-whitespace: -ifneq ($(NO_GIT), 1) - @contrib/check-whitespace.sh -else - $(warn "Skipping whitespace check because git is unavailable") -endif - -release-candidate: release testall - @$(JULIA_EXECUTABLE) contrib/add_license_to_files.jl #add license headers - @#Check documentation - @$(JULIA_EXECUTABLE) doc/NEWS-update.jl #Add missing cross-references to NEWS.md - @$(MAKE) -C doc unicode #Rebuild Unicode table if necessary - @$(JULIA_EXECUTABLE) doc/DocCheck.jl > doc/UNDOCUMENTED.rst 2>&1 #Check for undocumented items - @if [ -z "$(cat doc/UNDOCUMENTED.rst)" ]; then \ - rm doc/UNDOCUMENTED.rst; \ - else \ - echo "Undocumented functions found in doc/UNDOCUMENTED.rst; document them, then retry"; \ - exit 1; \ - fi - @$(MAKE) -C doc html SPHINXOPTS="-n" #Rebuild Julia HTML docs pedantically - @$(MAKE) -C doc latex SPHINXOPTS="-n" #Rebuild Julia PDF docs pedantically - @$(MAKE) -C doc doctest #Run Julia doctests - @$(MAKE) -C doc linkcheck #Check all links - @$(MAKE) -C doc helpdb.jl #Rebuild Julia online documentation for help(), apropos(), etc... - - @# Check to see if the above make invocations changed anything important - @if [ -n "$$(git status --porcelain)" ]; then \ - echo "Git repository dirty; Verify and commit changes to the repository, then retry"; \ - exit 1; \ - fi - - @#Check that benchmarks work - @$(MAKE) -C test/perf - @#Check that netload tests work - @#for test in test/netload/*.jl; do julia $$test; if [ $$? -ne 0 ]; then exit 1; fi; done - @echo - @echo To complete the release candidate checklist: - @echo - - @echo 1. Remove deprecations in base/deprecated.jl - @echo 2. Bump VERSION - @echo 3. Create tag, push to github "\(git tag v\`cat VERSION\` && git push --tags\)" #"` # These comments deal with incompetent syntax highlighting rules - @echo 4. Clean out old .tar.gz files living in deps/, "\`git clean -fdx\`" seems to work #"` - @echo 5. Replace github release tarball with tarballs created from make light-source-dist and make full-source-dist - @echo 6. Follow packaging instructions in DISTRIBUTING.md to create binary packages for all platforms - @echo 7. Upload to AWS, update http://julialang.org/downloads and http://status.julialang.org/stable links - @echo 8. Update checksums on AWS for tarball and packaged binaries - @echo 9. Announce on mailing lists - @echo 10. Change master to release-0.X in base/version.jl and base/version_git.sh as in 4cb1e20 - @echo - -$(build_docdir)/helpdb.jl: doc/helpdb.jl | $(build_docdir) +$(build_docdir)/helpdb.jl: doc/helpdb.jl @cp $< $@ -$(build_man1dir)/julia.1: doc/man/julia.1 | $(build_man1dir) - @mkdir -p $(build_man1dir) - @cp $< $@ - -$(build_sysconfdir)/julia/juliarc.jl: etc/juliarc.jl | $(build_sysconfdir)/julia - @cp $< $@ -ifeq ($(OS), WINNT) - @cat ./contrib/windows/juliarc.jl >> $(build_sysconfdir)/julia/juliarc.jl -$(build_sysconfdir)/julia/juliarc.jl: contrib/windows/juliarc.jl -endif - -.SECONDARY: $(build_private_libdir)/inference0.o -.SECONDARY: $(build_private_libdir)/inference.o .SECONDARY: $(build_private_libdir)/sys.o $(build_private_libdir)/%.$(SHLIB_EXT): $(build_private_libdir)/%.o @@ -146,421 +37,22 @@ else @true endif -CORE_SRCS := base/boot.jl base/coreimg.jl \ - base/abstractarray.jl \ - base/array.jl \ - base/bool.jl \ - base/dict.jl \ - base/error.jl \ - base/essentials.jl \ - base/expr.jl \ - base/functors.jl \ - base/hashing.jl \ - base/inference.jl \ - base/int.jl \ - base/intset.jl \ - base/iterator.jl \ - base/nofloat_hashing.jl \ - base/number.jl \ - base/operators.jl \ - base/options.jl \ - base/pointer.jl \ - base/promotion.jl \ - base/range.jl \ - base/reduce.jl \ - base/reflection.jl \ - base/tuple.jl - BASE_SRCS := $(wildcard base/*.jl base/*/*.jl base/*/*/*.jl) -$(build_private_libdir)/inference0.o: $(CORE_SRCS) | $(build_private_libdir) - @$(call PRINT_JULIA, cd base && \ - $(call spawn,$(JULIA_EXECUTABLE)) -C $(JULIA_CPU_TARGET) --output-o $(call cygpath_w,$(build_private_libdir)/inference0.o) -f \ - coreimg.jl) - -$(build_private_libdir)/inference.o: $(build_private_libdir)/inference0.$(SHLIB_EXT) - @$(call PRINT_JULIA, cd base && \ - $(call spawn,$(JULIA_EXECUTABLE)) -C $(JULIA_CPU_TARGET) --output-o $(call cygpath_w,$(build_private_libdir)/inference.o) -f \ - -J $(call cygpath_w,$(build_private_libdir)/inference0.$(SHLIB_EXT)) coreimg.jl) +# on windows, also generate a .ji file so we can delete the .dll +ifeq ($(OS),WINNT) +JULIA_SYSIMG_BUILD_FLAGS += --output-ji $(call cygpath_w,$(build_private_libdir)/sys.ji) +endif COMMA:=, -$(build_private_libdir)/sys.o: VERSION $(BASE_SRCS) $(build_docdir)/helpdb.jl $(build_private_libdir)/inference.$(SHLIB_EXT) +$(build_private_libdir)/sys.o: VERSION $(BASE_SRCS) $(build_docdir)/helpdb.jl @$(call PRINT_JULIA, cd base && \ - $(call spawn,$(JULIA_EXECUTABLE)) -C $(JULIA_CPU_TARGET) --output-o $(call cygpath_w,$(build_private_libdir)/sys.o) $(JULIA_SYSIMG_BUILD_FLAGS) -f \ - -J $(call cygpath_w,$(build_private_libdir)/inference.$(SHLIB_EXT)) sysimg.jl \ + $(call spawn,$(JULIA_EXECUTABLE)) -C $(JULIA_CPU_TARGET) --output-o $(call cygpath_w,$(build_private_libdir)/sys.o) $(JULIA_SYSIMG_BUILD_FLAGS) \ + --load-log $(call cygpath_w,$(build_private_libdir)/sys.fnames) -f \ + -J $(call cygpath_w,$(build_private_libdir)/inference.so) sysimg.jl \ || { echo '*** This error is usually fixed by running `make clean`. If the error persists$(COMMA) try `make cleanall`. ***' && false; } ) -$(build_bindir)/stringreplace: contrib/stringreplace.c | $(build_bindir) - @$(call PRINT_CC, $(CC) -o $(build_bindir)/stringreplace contrib/stringreplace.c) - - -# public libraries, that are installed in $(prefix)/lib -JL_LIBS = julia julia-debug - -# private libraries, that are installed in $(prefix)/lib/julia -JL_PRIVATE_LIBS = suitesparse_wrapper Rmath -ifeq ($(USE_SYSTEM_FFTW),0) -JL_PRIVATE_LIBS += fftw3 fftw3f fftw3_threads fftw3f_threads -endif -ifeq ($(USE_SYSTEM_PCRE),0) -JL_PRIVATE_LIBS += pcre -endif -ifeq ($(USE_SYSTEM_OPENLIBM),0) -ifeq ($(USE_SYSTEM_LIBM),0) -JL_PRIVATE_LIBS += openlibm -endif -endif -ifeq ($(USE_SYSTEM_OPENSPECFUN),0) -JL_PRIVATE_LIBS += openspecfun -endif -ifeq ($(USE_SYSTEM_DSFMT),0) -JL_PRIVATE_LIBS += dSFMT -endif -ifeq ($(USE_SYSTEM_BLAS),0) -JL_PRIVATE_LIBS += openblas -else ifeq ($(USE_SYSTEM_LAPACK),0) -JL_PRIVATE_LIBS += lapack -endif -ifeq ($(USE_SYSTEM_GMP),0) -JL_PRIVATE_LIBS += gmp -endif -ifeq ($(USE_SYSTEM_MPFR),0) -JL_PRIVATE_LIBS += mpfr -endif -ifeq ($(USE_SYSTEM_LIBGIT2),0) -JL_PRIVATE_LIBS += git2 -endif -ifeq ($(USE_SYSTEM_ARPACK),0) -JL_PRIVATE_LIBS += arpack -endif -ifeq ($(USE_SYSTEM_SUITESPARSE),0) -JL_PRIVATE_LIBS += amd camd ccolamd cholmod colamd umfpack spqr suitesparseconfig -endif -ifeq ($(USE_SYSTEM_LLVM),0) -ifeq ($(USE_LLVM_SHLIB),1) -JL_PRIVATE_LIBS += LLVM -endif -endif -ifeq ($(OS),Darwin) -ifeq ($(USE_SYSTEM_BLAS),1) -ifeq ($(USE_SYSTEM_LAPACK),0) -JL_PRIVATE_LIBS += gfortblas -endif -endif -endif - -ifeq ($(OS),WINNT) -define std_dll -julia-deps: | $$(build_bindir)/lib$(1).dll -$$(build_bindir)/lib$(1).dll: | $$(build_bindir) -ifeq ($$(BUILD_OS),$$(OS)) - cp $$(call pathsearch,lib$(1).dll,$$(PATH)) $$(build_bindir) ; -else - cp $$(call wine_pathsearch,lib$(1).dll,$$(STD_LIB_PATH)) $$(build_bindir) ; -endif -JL_LIBS += $(1) -endef -$(eval $(call std_dll,gfortran-3)) -$(eval $(call std_dll,quadmath-0)) -$(eval $(call std_dll,stdc++-6)) -ifeq ($(ARCH),i686) -$(eval $(call std_dll,gcc_s_sjlj-1)) -else -$(eval $(call std_dll,gcc_s_seh-1)) -endif -$(eval $(call std_dll,ssp-0)) -endif - -install: $(build_bindir)/stringreplace doc/_build/html - @$(MAKE) $(QUIET_MAKE) all - @for subdir in $(bindir) $(libexecdir) $(datarootdir)/julia/site/$(VERSDIR) $(docdir) $(man1dir) $(includedir)/julia $(libdir) $(private_libdir) $(sysconfdir); do \ - mkdir -p $(DESTDIR)$$subdir; \ - done - - $(INSTALL_M) $(build_bindir)/julia* $(DESTDIR)$(bindir)/ -ifeq ($(OS),WINNT) - -$(INSTALL_M) $(build_bindir)/*.dll $(DESTDIR)$(bindir)/ -else - -cp -a $(build_libexecdir) $(DESTDIR)$(prefix) - - # Copy over .dSYM directories directly -ifeq ($(OS),Darwin) - -cp -a $(build_libdir)/*.dSYM $(DESTDIR)$(private_libdir) -endif - - for suffix in $(JL_LIBS) ; do \ - for lib in $(build_libdir)/lib$${suffix}*.$(SHLIB_EXT)*; do \ - if [ "$${lib##*.}" != "dSYM" ]; then \ - $(INSTALL_M) $$lib $(DESTDIR)$(private_libdir) ; \ - fi \ - done \ - done - for suffix in $(JL_PRIVATE_LIBS) ; do \ - for lib in $(build_libdir)/lib$${suffix}*.$(SHLIB_EXT)*; do \ - if [ "$${lib##*.}" != "dSYM" ]; then \ - $(INSTALL_M) $$lib $(DESTDIR)$(private_libdir) ; \ - fi \ - done \ - done - - # Copy in libssl and libcrypto if they exist -ifeq ($(OS),Linux) - -$(INSTALL_M) $(build_libdir)/libssl*.so* $(DESTDIR)$(private_libdir) - -$(INSTALL_M) $(build_libdir)/libcrypto*.so* $(DESTDIR)$(private_libdir) -endif -endif - -ifeq ($(USE_SYSTEM_LIBUV),0) -ifeq ($(OS),WINNT) - $(INSTALL_F) $(build_includedir)/tree.h $(DESTDIR)$(includedir)/julia -endif - $(INSTALL_F) $(build_includedir)/uv* $(DESTDIR)$(includedir)/julia -endif - $(INSTALL_F) src/julia.h src/julia_version.h src/options.h src/support/*.h $(DESTDIR)$(includedir)/julia - # Copy system image - -$(INSTALL_F) $(build_private_libdir)/sys.ji $(DESTDIR)$(private_libdir) - $(INSTALL_M) $(build_private_libdir)/sys.$(SHLIB_EXT) $(DESTDIR)$(private_libdir) - # Copy in system image build script - $(INSTALL_M) contrib/build_sysimg.jl $(DESTDIR)$(datarootdir)/julia/ - # Copy in standalone executable build script - $(INSTALL_M) contrib/build_executable.jl $(DESTDIR)$(datarootdir)/julia/ - # Copy in standalone julia-config script - $(INSTALL_M) contrib/julia-config.jl $(DESTDIR)$(datarootdir)/julia/ - # Copy in all .jl sources as well - cp -R -L $(build_datarootdir)/julia $(DESTDIR)$(datarootdir)/ - # Copy documentation - cp -R -L $(build_docdir)/* $(DESTDIR)$(docdir)/ - cp -R -L doc/_build/html $(DESTDIR)$(docdir)/ - -rm $(DESTDIR)$(docdir)/html/.buildinfo - # Remove perf suite - -rm -rf $(DESTDIR)$(datarootdir)/julia/test/perf/ - # Remove various files which should not be installed - -rm -f $(DESTDIR)$(datarootdir)/julia/base/version_git.sh - -rm -f $(DESTDIR)$(datarootdir)/julia/test/Makefile - # Copy in beautiful new man page - $(INSTALL_F) $(build_man1dir)/julia.1 $(DESTDIR)$(man1dir)/ - # Copy icon and .desktop file - mkdir -p $(DESTDIR)$(datarootdir)/icons/hicolor/scalable/apps/ - $(INSTALL_F) contrib/julia.svg $(DESTDIR)$(datarootdir)/icons/hicolor/scalable/apps/ - -touch -c $(DESTDIR)$(datarootdir)/icons/hicolor/ - -gtk-update-icon-cache $(DESTDIR)$(datarootdir)/icons/hicolor/ - mkdir -p $(DESTDIR)$(datarootdir)/applications/ - $(INSTALL_F) contrib/julia.desktop $(DESTDIR)$(datarootdir)/applications/ - # Install appdata file - mkdir -p $(DESTDIR)$(datarootdir)/appdata/ - $(INSTALL_F) contrib/julia.appdata.xml $(DESTDIR)$(datarootdir)/appdata/ - - # Update RPATH entries and JL_SYSTEM_IMAGE_PATH if $(private_libdir_rel) != $(build_private_libdir_rel) -ifneq ($(private_libdir_rel),$(build_private_libdir_rel)) -ifeq ($(OS), Darwin) - for julia in $(DESTDIR)$(bindir)/julia* ; do \ - install_name_tool -rpath @executable_path/$(build_private_libdir_rel) @executable_path/$(private_libdir_rel) $$julia; \ - install_name_tool -rpath @executable_path/$(build_libdir_rel) @executable_path/$(libdir_rel) $$julia; \ - done -else ifeq ($(OS), Linux) - for julia in $(DESTDIR)$(bindir)/julia* ; do \ - patchelf --set-rpath '$$ORIGIN/$(private_libdir_rel):$$ORIGIN/$(libdir_rel)' $$julia; \ - done -endif - - # Overwrite JL_SYSTEM_IMAGE_PATH in julia library - for julia in $(DESTDIR)$(private_libdir)/libjulia*.$(SHLIB_EXT) ; do \ - $(call spawn,$(build_bindir)/stringreplace $$(strings -t x - $$julia | grep "sys.$(SHLIB_EXT)$$" | awk '{print $$1;}' ) "$(private_libdir_rel)/sys.$(SHLIB_EXT)" 256 $(call cygpath_w,$$julia)); \ - done -endif - - mkdir -p $(DESTDIR)$(sysconfdir) - cp -R $(build_sysconfdir)/julia $(DESTDIR)$(sysconfdir)/ - -distclean dist-clean: - rm -fr julia-*.tar.gz julia*.exe julia-*.7z julia-$(JULIA_COMMIT) - -dist: - @echo \'dist\' target is deprecated: use \'binary-dist\' instead. - -binary-dist: distclean -ifeq ($(USE_SYSTEM_BLAS),0) -ifneq ($(OPENBLAS_DYNAMIC_ARCH),1) - @echo OpenBLAS must be rebuilt with OPENBLAS_DYNAMIC_ARCH=1 to use binary-dist target - @false -endif -endif -ifneq ($(prefix),$(abspath julia-$(JULIA_COMMIT))) - $(error prefix must not be set for make binary-dist) -endif -ifneq ($(DESTDIR),) - $(error DESTDIR must not be set for make binary-dist) -endif - @$(MAKE) install - cp LICENSE.md $(prefix) -ifneq ($(OS), WINNT) - -./contrib/fixup-libgfortran.sh $(DESTDIR)$(private_libdir) -endif -ifeq ($(OS), Linux) - -./contrib/fixup-libstdc++.sh $(DESTDIR)$(private_libdir) -endif - # Copy in juliarc.jl files per-platform for binary distributions as well - # Note that we don't install to sysconfdir: we always install to $(DESTDIR)$(prefix)/etc. - # If you want to make a distribution with a hardcoded path, you take care of installation -ifeq ($(OS), Darwin) - -cat ./contrib/mac/juliarc.jl >> $(DESTDIR)$(prefix)/etc/julia/juliarc.jl -endif - - # purge sys.{dll,so,dylib} as that file is not relocatable across processor architectures -ifeq ($(JULIA_CPU_TARGET), native) - -rm -f $(DESTDIR)$(private_libdir)/sys.$(SHLIB_EXT) -endif - -ifeq ($(OS), WINNT) - [ ! -d dist-extras ] || ( cd dist-extras && \ - cp 7z.exe 7z.dll libexpat-1.dll zlib1.dll libgfortran-3.dll libquadmath-0.dll libstdc++-6.dll libgcc_s_s*-1.dll libssp-0.dll $(bindir) && \ - mkdir $(DESTDIR)$(prefix)/Git && \ - 7z x PortableGit.7z -o"$(DESTDIR)$(prefix)/Git" && \ - echo "[core] eol = lf" >> "$(DESTDIR)$(prefix)/Git/etc/gitconfig" && \ - sed -i "s/\bautocrlf = true$$/autocrlf = input/" "$(DESTDIR)$(prefix)/Git/etc/gitconfig" && \ - cp busybox.exe $(DESTDIR)$(prefix)/Git/bin/echo.exe && \ - cp busybox.exe $(DESTDIR)$(prefix)/Git/bin/printf.exe ) - cd $(DESTDIR)$(bindir) && rm -f llvm* llc.exe lli.exe opt.exe LTO.dll bugpoint.exe macho-dump.exe - - # create file listing for uninstall. note: must have Windows path separators and line endings. - cd $(prefix) && find * | sed -e 's/\//\\/g' -e 's/$$/\r/g' > etc/uninstall.log - - # build nsis package - $(call spawn,./dist-extras/nsis/makensis.exe) -NOCD -DVersion=$(JULIA_VERSION) -DArch=$(ARCH) -DCommit=$(JULIA_COMMIT) ./contrib/windows/build-installer.nsi - - # compress nsis installer and combine with 7zip self-extracting header - ./dist-extras/7z a -mx9 "julia-install-$(JULIA_COMMIT)-$(ARCH).7z" julia-installer.exe - cat ./contrib/windows/7zS.sfx ./contrib/windows/7zSFX-config.txt "julia-install-$(JULIA_COMMIT)-$(ARCH).7z" > "julia-${JULIA_VERSION}-${ARCH}.exe" - -rm -f julia-installer.exe -else - $(TAR) zcvf $(JULIA_BINARYDIST_TARNAME).tar.gz julia-$(JULIA_COMMIT) -endif - rm -fr $(prefix) - -light-source-dist.tmp: doc/_build/html - # Save git information - -@$(MAKE) -C base version_git.jl.phony - - # Create file light-source-dist.tmp to hold all the filenames that go into the tarball - echo "base/version_git.jl" > light-source-dist.tmp - git ls-files | sed -e '/\.git/d' -e '/\.travis/d' >> light-source-dist.tmp - find doc/_build/html >> light-source-dist.tmp - -# Make tarball with only Julia code -light-source-dist: light-source-dist.tmp - # Prefix everything with the current directory name (usually "julia"), then create tarball - DIRNAME=$$(basename $$(pwd)); \ - sed -e "s_.*_$$DIRNAME/&_" light-source-dist.tmp > light-source-dist.tmp1; \ - cd ../ && tar -cz -T $$DIRNAME/light-source-dist.tmp1 --no-recursion -f $$DIRNAME/julia-$(JULIA_VERSION)_$(JULIA_COMMIT).tar.gz - -source-dist: - @echo \'source-dist\' target is deprecated: use \'full-source-dist\' instead. - -# Make tarball with Julia code plus all dependencies -full-source-dist: light-source-dist.tmp - # Get all the dependencies downloaded - @$(MAKE) -C deps getall NO_GIT=1 - - # Create file full-source-dist.tmp to hold all the filenames that go into the tarball - cp light-source-dist.tmp full-source-dist.tmp - -ls deps/*.tar.gz deps/*.tar.bz2 deps/*.tar.xz deps/*.tgz deps/*.zip >> full-source-dist.tmp - - # Prefix everything with the current directory name (usually "julia"), then create tarball - DIRNAME=$$(basename $$(pwd)); \ - sed -e "s_.*_$$DIRNAME/&_" full-source-dist.tmp > full-source-dist.tmp1; \ - cd ../ && tar -cz -T $$DIRNAME/full-source-dist.tmp1 --no-recursion -f $$DIRNAME/julia-$(JULIA_VERSION)_$(JULIA_COMMIT)-full.tar.gz - -clean: | $(CLEAN_TARGETS) - @$(MAKE) -C base clean - @$(MAKE) -C doc clean - @$(MAKE) -C src clean - @$(MAKE) -C ui clean - @$(MAKE) -C test clean - @rm -f julia - @rm -f *~ *# *.tar.gz - @rm -f $(build_bindir)/stringreplace \ - light-source-dist.tmp light-source-dist.tmp1 \ - full-source-dist.tmp full-source-dist.tmp1 - @rm -fr $(build_private_libdir) -# Temporarily add this line to the Makefile to remove extras - @rm -fr $(build_datarootdir)/julia/extras - -cleanall: clean - @$(MAKE) -C src clean-flisp clean-support - @rm -fr $(build_shlibdir) -ifeq ($(OS),WINNT) - @rm -rf $(build_prefix)/lib -endif - @$(MAKE) -C deps clean-libuv - -distcleanall: cleanall - @$(MAKE) -C deps distcleanall - @$(MAKE) -C doc cleanall - rm -fr $(build_prefix) $(build_staging) - -.PHONY: default debug release check-whitespace release-candidate \ - julia-debug julia-release julia-deps \ - julia-ui-release julia-ui-debug julia-src-release julia-src-debug \ - julia-symlink julia-base julia-sysimg \ - test testall testall1 test clean distcleanall cleanall \ - run-julia run-julia-debug run-julia-release run \ - install binary-dist light-source-dist.tmp light-source-dist \ - dist full-source-dist source-dist - -test: check-whitespace $(JULIA_BUILD_MODE) - @$(MAKE) $(QUIET_MAKE) -C test default JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -testall: check-whitespace $(JULIA_BUILD_MODE) - cp $(build_prefix)/lib/julia/sys.$(SHLIB_EXT) local.$(SHLIB_EXT) && $(JULIA_EXECUTABLE) -J local.$(SHLIB_EXT) -e 'true' && rm local.$(SHLIB_EXT) - @$(MAKE) $(QUIET_MAKE) -C test all JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -testall1: check-whitespace $(JULIA_BUILD_MODE) - @env JULIA_CPU_CORES=1 $(MAKE) $(QUIET_MAKE) -C test all JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -test-%: check-whitespace $(JULIA_BUILD_MODE) - @$(MAKE) $(QUIET_MAKE) -C test $* JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -perf: release - @$(MAKE) $(QUIET_MAKE) -C test/perf JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -perf-%: release - @$(MAKE) $(QUIET_MAKE) -C test/perf $* JULIA_BUILD_MODE=$(JULIA_BUILD_MODE) - -# download target for some hardcoded windows dependencies -.PHONY: win-extras wine_path -win-extras: - [ -d dist-extras ] || mkdir dist-extras -ifneq ($(BUILD_OS),WINNT) -ifeq (,$(findstring CYGWIN,$(BUILD_OS))) - cp /usr/lib/p7zip/7z /usr/lib/p7zip/7z.so dist-extras -endif -endif -ifneq (,$(filter $(ARCH), i386 i486 i586 i686)) - cd dist-extras && \ - $(JLDOWNLOAD) http://downloads.sourceforge.net/sevenzip/7z920.exe && \ - 7z x -y 7z920.exe 7z.exe 7z.dll && \ - ../contrib/windows/winrpm.sh http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_13.1 \ - "mingw32-libgfortran3 mingw32-libquadmath0 mingw32-libstdc++6 mingw32-libgcc_s_sjlj1 mingw32-libssp0 mingw32-libexpat1 mingw32-zlib1" && \ - cp usr/i686-w64-mingw32/sys-root/mingw/bin/*.dll . -else ifeq ($(ARCH),x86_64) - cd dist-extras && \ - $(JLDOWNLOAD) 7z920-x64.msi http://downloads.sourceforge.net/sevenzip/7z920-x64.msi && \ - 7z x -y 7z920-x64.msi _7z.exe _7z.dll && \ - mv _7z.dll 7z.dll && \ - mv _7z.exe 7z.exe && \ - ../contrib/windows/winrpm.sh http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_13.1 \ - "mingw64-libgfortran3 mingw64-libquadmath0 mingw64-libstdc++6 mingw64-libgcc_s_seh1 mingw64-libssp0 mingw64-libexpat1 mingw64-zlib1" && \ - cp usr/x86_64-w64-mingw32/sys-root/mingw/bin/*.dll . -else - $(error no win-extras target for ARCH=$(ARCH)) -endif - cd dist-extras && \ - $(JLDOWNLOAD) http://downloads.sourceforge.net/sevenzip/7z920_extra.7z && \ - $(JLDOWNLOAD) https://unsis.googlecode.com/files/nsis-2.46.5-Unicode-setup.exe && \ - $(JLDOWNLOAD) busybox.exe http://frippery.org/files/busybox/busybox-w32-FRP-1-g9eb16cb.exe && \ - chmod a+x 7z.exe && \ - chmod a+x 7z.dll && \ - $(call spawn,./7z.exe) x -y -onsis nsis-2.46.5-Unicode-setup.exe && \ - chmod a+x ./nsis/makensis.exe && \ - chmod a+x busybox.exe && \ - $(JLDOWNLOAD) PortableGit.7z https://github.com/msysgit/msysgit/releases/download/Git-1.9.5-preview20141217/PortableGit-1.9.5-preview20141217.7z +.PHONY: default debug release release-candidate \ + julia-debug julia-release \ + julia-base julia-sysimg \ + test testall testall1 test diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt new file mode 100644 index 0000000000000..9cee2cab6d892 --- /dev/null +++ b/base/CMakeLists.txt @@ -0,0 +1,68 @@ +# + +# TODO JULIA_CPU_TARGET +set(JULIA_CPU_TARGET native) + +jl_custom_target(julia-inference0 + inference0.o + coreimg.jl julia-ui + inference0.fnames + COMMAND "${build_bindir}/julia" -C ${JULIA_CPU_TARGET} + --output-o "${CMAKE_CURRENT_BINARY_DIR}/inference0.o" + --load-log "${CMAKE_CURRENT_BINARY_DIR}/inference0.fnames" -f coreimg.jl + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") + +if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/dummy.c") + execute_process(COMMAND "${CMAKE_COMMAND}" -E + touch "${CMAKE_CURRENT_BINARY_DIR}/dummy.c") +endif() + +add_library(julia-inference0-so MODULE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c") + +target_link_libraries(julia-inference0-so + "${CMAKE_CURRENT_BINARY_DIR}/inference0.o" + libjulia) + +set_target_properties(julia-inference0-so PROPERTIES + OUTPUT_NAME inference0 + PREFIX "") + +add_dependencies(julia-inference0-so julia-inference0) + +# TODO? use inference.so if it exists +jl_custom_target(julia-inference + "${build_private_libdir}/inference.o" + "coreimg.jl;${CMAKE_CURRENT_BINARY_DIR}/inference0.o" + "julia-ui;julia-inference0-so" + inference.fnames + COMMAND "${build_bindir}/julia" -C ${JULIA_CPU_TARGET} + --output-o "${build_private_libdir}/inference.o" -f + --load-log "${CMAKE_CURRENT_BINARY_DIR}/inference.fnames" + -J "${CMAKE_CURRENT_BINARY_DIR}/inference0.so" coreimg.jl + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") + +add_library(julia-inference-so MODULE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c") + +target_link_libraries(julia-inference-so + "${build_private_libdir}/inference.o" + libjulia) + +set_target_properties(julia-inference-so PROPERTIES + OUTPUT_NAME inference + PREFIX "" + LIBRARY_OUTPUT_DIRECTORY "${build_private_libdir}") + +add_dependencies(julia-inference-so julia-inference) + +set(errno_h_jl "${CMAKE_CURRENT_BINARY_DIR}/errno_h.jl") + +add_custom_command(OUTPUT errno_h.jl + COMMAND "${CMAKE_COMMAND}" "-DOUTPUT_FILE=${errno_h_jl}" + "-DCPP_COMMAND=${CPP_COMMAND}" "-DCUR_BIN_DIR=${CMAKE_CURRENT_BINARY_DIR}" + "-DCUR_SRC_DIR=${CMAKE_CURRENT_SOURCE_DIR}" + -P errno_h.jl.cmake + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS errno_h.jl.cmake VERBATIM) + +add_custom_target(julia-errno_h.jl + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/errno_h.jl") diff --git a/base/Makefile b/base/Makefile index 4b621a2216dd8..710350619b846 100644 --- a/base/Makefile +++ b/base/Makefile @@ -1,5 +1,3 @@ -JULIAHOME = .. -include ../deps/Versions.make include ../Make.inc TAGGED_RELEASE_BANNER = "" @@ -10,7 +8,12 @@ else CPP_STDOUT = $(CPP) -E endif -all: pcre_h.jl errno_h.jl build_h.jl.phony fenv_constants.jl file_constants.jl uv_constants.jl version_git.jl.phony +all: $(CMAKE_BINARY_DIR)/base/pcre_h.jl \ + $(CMAKE_BINARY_DIR)/base/build_h.jl.phony \ + $(CMAKE_BINARY_DIR)/base/fenv_constants.jl \ + $(CMAKE_BINARY_DIR)/base/file_constants.jl \ + $(CMAKE_BINARY_DIR)/base/uv_constants.jl \ + $(CMAKE_BINARY_DIR)/base/version_git.jl.phony PCRE_CONST = 0x[0-9a-fA-F]+|[0-9]+ ifeq ($(USE_SYSTEM_PCRE), 1) @@ -19,22 +22,19 @@ else PCRE_INCL_PATH = $(build_includedir)/pcre2.h endif -pcre_h.jl: +$(CMAKE_BINARY_DIR)/base/pcre_h.jl: @$(call PRINT_PERL, $(CPP) -D PCRE2_CODE_UNIT_WIDTH=8 -dM $(PCRE_INCL_PATH) | perl -nle '/^\s*#define\s+PCRE2_(\w*)\s*\(?($(PCRE_CONST))\)?u?\s*$$/ and print "const $$1 = UInt32($$2)"' | sort > $@) -errno_h.jl: - @$(call PRINT_PERL, echo '#include "errno.h"' | $(CPP) -dM - | perl -nle 'print "const $$1 = Int32($$2)" if /^#define\s+(E\w+)\s+(\d+)\s*$$/' | sort > $@) - -fenv_constants.jl: ../src/fenv_constants.h +$(CMAKE_BINARY_DIR)/base/fenv_constants.jl: ../src/fenv_constants.h @$(PRINT_PERL) $(CPP_STDOUT) -DJULIA -I../deps/openlibm/include ../src/fenv_constants.h | tail -n 8 | perl -ple 's/\sFE_UN\w+/ 0x10/g; s/\sFE_O\w+/ 0x08/g; s/\sFE_DI\w+/ 0x04/g; s/\sFE_INV\w+/ 0x01/g; s/\sFE_TON\w+/ 0x00/g; s/\sFE_UP\w+/ 0x800/g; s/\sFE_DO\w+/ 0x400/g; s/\sFE_TOW\w+/ 0xc00/g' > $@ -file_constants.jl: ../src/file_constants.h +$(CMAKE_BINARY_DIR)/base/file_constants.jl: ../src/file_constants.h @$(call PRINT_PERL, $(CPP_STDOUT) -DJULIA ../src/file_constants.h | perl -nle 'print "$$1 0o$$2" if /^(\s*const\s+[A-z_]+\s+=)\s+(0[0-9]*)\s*$$/; print "$$1" if /^\s*(const\s+[A-z_]+\s+=\s+([1-9]|0x)[0-9A-z]*)\s*$$/' > $@) -uv_constants.jl: ../src/uv_constants.h $(build_includedir)/uv-errno.h +$(CMAKE_BINARY_DIR)/base/uv_constants.jl: ../src/uv_constants.h $(build_includedir)/uv-errno.h @$(call PRINT_PERL, $(CPP_STDOUT) "-I$(LIBUV_INC)" -DJULIA ../src/uv_constants.h | tail -n 16 > $@) -build_h.jl.phony: +$(CMAKE_BINARY_DIR)/base/build_h.jl.phony: @echo "# This file is automatically generated in base/Makefile" > $@ @echo "const ARCH = :$(ARCH)" >> $@ ifeq ($(XC_HOST),) @@ -66,48 +66,34 @@ endif @# This to ensure that we always rebuild this file, but only when it is modified do we touch build_h.jl, @# ensuring we rebuild the system image as infrequently as possible - @if ! cmp -s $@ build_h.jl; then \ + @if ! cmp -s $@ $(CMAKE_BINARY_DIR)/base/build_h.jl; then \ $(call PRINT_PERL,) \ - mv $@ build_h.jl; \ + mv $@ $(CMAKE_BINARY_DIR)/base/build_h.jl; \ else \ rm -f $@; \ fi -version_git.jl.phony: +$(CMAKE_BINARY_DIR)/base/version_git.jl.phony: ifneq ($(NO_GIT), 1) @sh version_git.sh > $@ @# This to avoid touching git_version.jl when it is not modified, @# so that the system image does not need to be rebuilt. - @if ! cmp -s $@ version_git.jl; then \ + @if ! cmp -s $@ $(CMAKE_BINARY_DIR)/base/version_git.jl; then \ $(call PRINT_PERL,) \ - mv $@ version_git.jl; \ + mv $@ $(CMAKE_BINARY_DIR)/base/version_git.jl; \ else \ rm -f $@; \ fi else -ifeq ($(shell [ -f version_git.jl ] && echo "true"), true) +ifeq ($(shell [ -f $(CMAKE_BINARY_DIR)/base/version_git.jl ] && echo "true"), true) @# Give warning if boilerplate git is used - @if grep -q "Default output if git is not available" version_git.jl; then \ + @if grep -q "Default output if git is not available" $(CMAKE_BINARY_DIR)/base/version_git.jl; then \ echo "WARNING: Using boilerplate git version info" >&2; \ fi else $(warning "WARNING: Generating boilerplate git version info") - @sh version_git.sh NO_GIT > version_git.jl + @sh version_git.sh NO_GIT > $(CMAKE_BINARY_DIR)/base/version_git.jl endif endif -.PHONY: build_h.jl.phony version_git.jl.phony - - - -clean: - rm -f *# *~ - rm -f pcre_h.jl - rm -f errno_h.jl - rm -f build_h.jl - rm -f build_h.jl.phony - rm -f fenv_constants.jl - rm -f uv_constants.jl - rm -f file_constants.jl - rm -f version_git.jl - rm -f version_git.jl.phony +.PHONY: $(CMAKE_BINARY_DIR)/base/build_h.jl.phony $(CMAKE_BINARY_DIR)/base/version_git.jl.phony diff --git a/base/errno_h.jl.cmake b/base/errno_h.jl.cmake new file mode 100644 index 0000000000000..859a461646c2d --- /dev/null +++ b/base/errno_h.jl.cmake @@ -0,0 +1,42 @@ +#!/usr/bin/cmake -P + +# OUTPUT_FILE +# CPP_COMMAND +# CUR_BIN_DIR +# CUR_SRC_DIR + +file(REMOVE "${CUR_BIN_DIR}/errno_h.jl.tmp1") + +file(WRITE "${CUR_BIN_DIR}/errno_h.jl.tmp1" "#include \"errno.h\"") + +execute_process(COMMAND ${CPP_COMMAND} -dM - + RESULT_VARIABLE ret + OUTPUT_VARIABLE output_str + INPUT_FILE "${CUR_BIN_DIR}/errno_h.jl.tmp1") + +if(NOT ${ret} EQUAL 0) + message(FATAL_ERROR "") +endif() + +file(REMOVE "${CUR_BIN_DIR}/errno_h.jl.tmp1") + +string(REPLACE "\n" ";" output_str "${output_str}") + +set(names) + +foreach(line ${output_str}) + # TODO? handle `#define E... E...`? + if(${line} MATCHES "^#define[ \t]+(E[a-zA-Z0-9]+)[ \t]+([0-9]+)[ \t]*\$") + set(names ${names} ${CMAKE_MATCH_1}) + set("errno_${CMAKE_MATCH_1}" ${CMAKE_MATCH_2}) + endif() +endforeach() + +list(SORT names) + +file(REMOVE "${OUTPUT_FILE}") + +foreach(name ${names}) + file(APPEND "${OUTPUT_FILE}" + "const ${name} = Int32(${errno_${name}})\n") +endforeach() diff --git a/cmake/CatFiles.cmake b/cmake/CatFiles.cmake new file mode 100644 index 0000000000000..72b2f1e80b16c --- /dev/null +++ b/cmake/CatFiles.cmake @@ -0,0 +1,10 @@ +# + +set(content) + +foreach(i RANGE 1 ${NSRC}) + file(READ "${SRC${i}}" c) + set(content "${content}${c}") +endforeach() + +file(WRITE "${DST}" "${content}") diff --git a/cmake/JuliaCCompiler.cmake b/cmake/JuliaCCompiler.cmake new file mode 100644 index 0000000000000..eb134371c6d3d --- /dev/null +++ b/cmake/JuliaCCompiler.cmake @@ -0,0 +1,84 @@ +# + +# libc++ is standard on OS X 10.9, but not for earlier releases +jl_option(USE_LIBCPP "Use libc++" Off) +# assume we don't have LIBSSP support in our compiler, +# will enable later if likely true +set(HAVE_SSP Off) + +jl_set_option(USEICC Off) +jl_set_option(USEGCC Off) +jl_set_option(USECLANG Off) +jl_set_option(USEMSVC Off) + +push_c_flags(CMAKE_CXX_FLAGS -std=c++11) + +if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" OR + CMAKE_C_COMPILER_ID STREQUAL "Clang") + jl_set_option(USECLANG On) + add_definitions(-pipe -fPIC) + push_c_flags(CMAKE_C_FLAGS -fno-strict-aliasing -D_FILE_OFFSET_BITS=64) + push_c_flags(CMAKE_CXX_FLAGS -fno-rtti) + push_c_flags(CMAKE_C_FLAGS_DEBUG -O0 -g -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_CXX_FLAGS_DEBUG -O0 -g -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_C_FLAGS_RELEASE -O3 -g) + push_c_flags(CMAKE_CXX_FLAGS_RELEASE -O3 -g) + if(APPLE) + if(USE_LIBCPP) + add_definitions(-stdlib=libc++ -mmacosx-version-min=10.7) + else() + add_definitions(-mmacosx-version-min=10.6) + endif() + add_definitions(-D_LARGEFILE_SOURCE -D_DARWIN_USE_64_BIT_INODE=1) + endif() +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") + jl_set_option(USEGCC On) + add_definitions(-pipe -fPIC) + push_c_flags(CMAKE_C_FLAGS -std=gnu99 -fno-strict-aliasing + -D_FILE_OFFSET_BITS=64) + push_c_flags(CMAKE_CXX_FLAGS -fno-rtti) + push_c_flags(CMAKE_C_FLAGS_DEBUG -O0 -ggdb3 -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_CXX_FLAGS_DEBUG -O0 -ggdb3 -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_C_FLAGS_RELEASE -O3 -ggdb3 -falign-functions) + push_c_flags(CMAKE_CXX_FLAGS_RELEASE -O3 -ggdb3 -falign-functions) +elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel") + jl_set_option(USEICC On) + add_definitions(-pipe -fPIC) + push_c_flags(CMAKE_C_FLAGS -std=gnu99 -fno-strict-aliasing + -D_FILE_OFFSET_BITS=64 -fp-model precise -fp-model except -no-ftz) + push_c_flags(CMAKE_CXX_FLAGS -fno-rtti) + push_c_flags(CMAKE_C_FLAGS_DEBUG -O0 -g -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_CXX_FLAGS_DEBUG -O0 -g -DJL_DEBUG_BUILD + -fstack-protector-all) + push_c_flags(CMAKE_C_FLAGS_RELEASE -O3 -g -falign-functions) + push_c_flags(CMAKE_CXX_FLAGS_RELEASE -O3 -g -falign-functions) +elseif(CMAKE_C_COMPILER_ID STREQUAL "MSVC") + jl_set_option(USEMSVC On) +else() + # TODO + message(FATAL_ERROR "Unsupported compiler ${CMAKE_C_COMPILER_ID}") +endif() + +include_directories("${CMAKE_BINARY_DIR}/include") + +if(NOT USECLANG) + if(USE_LIBCPP) + message(FATAL_ERROR + "USE_LIBCPP only supported with clang. Try setting USE_LIBCPP=0") + endif() + if(SANITIZE) + message(FATAL_ERROR + "Address Sanitizer only supported with clang. Try setting SANITIZE=0") + endif() +endif() + +if(NOT USEMSVC) + set(CPP_COMMAND ${CMAKE_C_COMPILER} -E -P) +else() + set(CPP_COMMAND ${CMAKE_C_COMPILER} -EP -E) +endif() diff --git a/cmake/JuliaDeps.cmake b/cmake/JuliaDeps.cmake new file mode 100644 index 0000000000000..86bf998a7bd41 --- /dev/null +++ b/cmake/JuliaDeps.cmake @@ -0,0 +1,16 @@ +jl_str_option(LLVM_VER "" 3.3) +jl_str_option(LLVM_LIB_SUFFIX "" "") +jl_str_option(PCRE_VER "" 10.20) +jl_str_option(DSFMT_VER "" 2.2.3) +jl_str_option(LAPACK_VER "" 3.5.0) +jl_str_option(ARPACK_VER "" 3.2.0) +jl_str_option(FFTW_VER "" 3.3.4) +jl_str_option(SUITESPARSE_VER "" 4.4.2) +jl_str_option(UNWIND_VER "" 1.1) +jl_str_option(OSXUNWIND_VER "" 0.0.1) +jl_str_option(GMP_VER "" 6.0.0) +jl_str_option(MPFR_VER "" 3.1.2) +jl_str_option(PATCHELF_VER "" 0.8) +jl_str_option(GIT_VER "" 1.8.5.6) +jl_str_option(VIRTUALENV_VER "" 1.11.6) +jl_str_option(RMATH_JULIA_VER "" 0.1) diff --git a/cmake/JuliaDirs.cmake b/cmake/JuliaDirs.cmake new file mode 100644 index 0000000000000..a5a9321f6d008 --- /dev/null +++ b/cmake/JuliaDirs.cmake @@ -0,0 +1,80 @@ +# + +jl_set_make_flag(JULIAHOME "${CMAKE_SOURCE_DIR}") + +if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR) + set(CMAKE_INSTALL_DATAROOTDIR share) +endif() + +if(NOT DEFINED CMAKE_INSTALL_DOCDIR) + set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc") +endif() + +include(GNUInstallDirs) +function(set_install_dir name val) + set("${name}" "${val}" PARENT_SCOPE) + jl_set_make_flag("${name}" "${val}") +endfunction() +set_install_dir(prefix "${CMAKE_INSTALL_PREFIX}") +set_install_dir(bindir "${CMAKE_INSTALL_FULL_BINDIR}") +set_install_dir(libdir "${CMAKE_INSTALL_FULL_LIBDIR}") +set_install_dir(private_libdir "${CMAKE_INSTALL_FULL_LIBDIR}/julia") +set_install_dir(libexecdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}") +set_install_dir(datarootdir "${CMAKE_INSTALL_FULL_DATAROOTDIR}") +set_install_dir(docdir "${CMAKE_INSTALL_FULL_DOCDIR}") +set_install_dir(mandir "${CMAKE_INSTALL_FULL_MANDIR}") +set_install_dir(man1dir "${CMAKE_INSTALL_FULL_MANDIR}/man1") +set_install_dir(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}") +set_install_dir(sysconfdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") + +function(set_build_dir name val) + set("build_${name}" "${val}" PARENT_SCOPE) + jl_set_make_flag("build_${name}" "${val}") + file(MAKE_DIRECTORY "${val}") +endfunction() + +jl_set_make_flag(JULIAHOME "${CMAKE_SOURCE_DIR}") + +# Directories where things get built into +set_build_dir(prefix "${CMAKE_BINARY_DIR}/usr") +set_build_dir(staging "${CMAKE_BINARY_DIR}/usr-staging") +set_build_dir(bindir "${build_prefix}/bin") +set_build_dir(libdir "${build_prefix}/lib") +set_build_dir(private_libdir "${build_prefix}/lib/julia") +set_build_dir(libexecdir "${build_prefix}/libexec") +set_build_dir(datarootdir "${build_prefix}/share") +set_build_dir(docdir "${build_prefix}/doc/julia") +set_build_dir(mandir "${build_prefix}/man") +set_build_dir(man1dir "${build_mandir}/man1") +set_build_dir(includedir "${build_prefix}/include") +set_build_dir(sysconfdir "${build_prefix}/etc") +# On Windows, we want shared library files to end up in ${build_bindir}, +# instead of ${build_libdir} +if(WIN32) + set_build_dir(shlibdir "${build_bindir}") +else() + set_build_dir(shlibdir "${build_libdir}") +endif() + +file(MAKE_DIRECTORY "${build_sysconfdir}/julia") +file(MAKE_DIRECTORY "${build_datarootdir}/julia/base") +file(MAKE_DIRECTORY "${build_datarootdir}/julia/test") + +function(set_relative_dir name from to) + file(RELATIVE_PATH rel "${from}" "${to}") + set("${name}" "${rel}" PARENT_SCOPE) + jl_set_make_flag("${name}" "${rel}") +endfunction() + +set_relative_dir(build_libdir_rel "${build_bindir}" "${build_libdir}") +set_relative_dir(libdir_rel "${bindir}" "${libdir}") +set_relative_dir(build_private_libdir_rel "${build_bindir}" + "${build_private_libdir}") +set_relative_dir(private_libdir_rel "${bindir}" "${private_libdir}") +set_relative_dir(datarootdir_rel "${bindir}" "${datarootdir}") +set_relative_dir(docdir_rel "${bindir}" "${docdir}") +set_relative_dir(sysconfdir_rel "${bindir}" "${sysconfdir}") + +file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/julia") + +jl_set_make_flag(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}") diff --git a/cmake/JuliaFortranCompiler.cmake b/cmake/JuliaFortranCompiler.cmake new file mode 100644 index 0000000000000..1d4ce82801b4c --- /dev/null +++ b/cmake/JuliaFortranCompiler.cmake @@ -0,0 +1,15 @@ +# + +jl_set_option(USEIFC Off) +jl_set_option(USEGFORTRAN Off) + +if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" OR + CMAKE_Fortran_COMPILER_ID STREQUAL "G95") + jl_set_option(USEGFORTRAN On) +elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") + jl_set_option(USEIFC On) +else() + # TODO + message(FATAL_ERROR + "Unsupported Fortran compiler ${CMAKE_Fortran_COMPILER_ID}") +endif() diff --git a/cmake/JuliaOptions.cmake b/cmake/JuliaOptions.cmake new file mode 100644 index 0000000000000..87d944987deaa --- /dev/null +++ b/cmake/JuliaOptions.cmake @@ -0,0 +1,57 @@ +# + +## Temporary functions to generate make flags from cmake options +set(jl_make_option_names CACHE INTERNAL "" FORCE) + +function(jl_set_make_flag name val) + set(jl_make_option_names ${jl_make_option_names} + ${name} CACHE INTERNAL "" FORCE) + set("_jl_make_flag_${name}" "${val}" CACHE INTERNAL "" FORCE) +endfunction() + +function(jl_get_make_flags var) + set(option_names "${jl_make_option_names}") + list(REMOVE_DUPLICATES option_names) + set(flags) + foreach(opt ${option_names}) + set(flags ${flags} "${opt}=${_jl_make_flag_${opt}}") + endforeach() + set(${var} ${flags} PARENT_SCOPE) +endfunction() + +function(jl_set_option name val) + if(${val}) + jl_set_make_flag(${name} 1) + else() + jl_set_make_flag(${name} 0) + endif() +endfunction() + +function(jl_option opt doc val) + set(jl_make_options ${jl_make_options} ${opt}) + option("${opt}" "${doc}" "${val}") + jl_set_option(${opt} ${${opt}}) +endfunction() + +function(jl_str_option name doc def_val) + if(DEFINED "${name}") + set("${name}_DEFINED" On CACHE INTERNAL "" FORCE) + else() + set("${name}_DEFINED" Off CACHE INTERNAL "" FORCE) + set("${name}" "${def_val}" CACHE INTERNAL "" FORCE) + endif() + jl_set_make_flag("${name}" "${${name}}") +endfunction() + +function(use_system_opt lib) + jl_option("USE_SYSTEM_${lib}" + "Use ${lib} available on the system instead of building it" Off) +endfunction() + +function(push_c_flags var) + set(res "${${var}}") + foreach(i RANGE 1 ${ARGC}) + set(res "${res} ${ARGV${i}}") + endforeach() + set(${var} "${res}" PARENT_SCOPE) +endfunction() diff --git a/cmake/JuliaUtils.cmake b/cmake/JuliaUtils.cmake new file mode 100644 index 0000000000000..63a8606327d39 --- /dev/null +++ b/cmake/JuliaUtils.cmake @@ -0,0 +1,50 @@ +# + +get_filename_component(jl_cmake_utils_dir + "${CMAKE_CURRENT_LIST_FILE}" PATH) + +set(jl_cmake_utils_dir "${jl_cmake_utils_dir}" CACHE "" INTERNAL FORCE) + +function(jl_rewrite_dep_list var deps) + set(new_deps) + foreach(dep ${deps}) + if(TARGET "${dep}") + set(new_deps ${new_deps} "$") + elseif(IS_ABSOLUTE "${dep}") + set(new_deps ${new_deps} ${dep}) + else() + get_filename_component(dep "${dep}" ABSOLUTE) + set(new_deps ${new_deps} ${dep}) + endif() + endforeach() + set(${var} "${new_deps}" PARENT_SCOPE) +endfunction() + +function(jl_rewrite_output_list var outputs) + set(new_outputs) + foreach(output ${outputs}) + if(IS_ABSOLUTE "${output}") + set(new_outputs ${new_outputs} ${output}) + else() + set(new_outputs ${new_outputs} "${CMAKE_CURRENT_BINARY_DIR}/${output}") + endif() + endforeach() + set(${var} "${new_outputs}" PARENT_SCOPE) +endfunction() + +function(jl_custom_target target outputs output_deps target_deps autodep_file) + jl_rewrite_dep_list(output_deps "${output_deps}") + jl_rewrite_output_list(outputs "${outputs}") + if((NOT "${autodep_file}" STREQUAL "") AND + (NOT IS_ABSOLUTE "${autodep_file}")) + set(autodep_file "${CMAKE_CURRENT_BINARY_DIR}/${autodep_file}") + endif() + add_custom_target("${target}" ALL + COMMAND "${CMAKE_COMMAND}" + "-DOUTPUTS=${outputs}" "-DOUTPUT_DEPS=${output_deps}" + "-DAUTODEP_FILE=${autodep_file}" "-DCOMMAND_SPEC=${ARGN}" + "-DCUR_BIN_DIR=${CMAKE_CURRENT_BINARY_DIR}" + "-DCUR_SRC_DIR=${CMAKE_CURRENT_SOURCE_DIR}" + -P "${jl_cmake_utils_dir}/jl_custom_target.cmake" + DEPENDS ${target_deps} VERBATIM) +endfunction() diff --git a/cmake/JuliaVersion.cmake b/cmake/JuliaVersion.cmake new file mode 100644 index 0000000000000..2e62924dbc85f --- /dev/null +++ b/cmake/JuliaVersion.cmake @@ -0,0 +1,59 @@ +find_package(Git QUIET) + +if(GIT_FOUND) + set(NO_GIT_DEF Off) +else() + set(NO_GIT_DEF On) +endif() + +jl_option(NO_GIT "Do not use git during the build" "${NO_GIT_DEF}") +if(NOT NO_GIT AND NOT IS_DIRECTORY "${CMAKE_SOURCE_DIR}/.git") + message(WARNING "git information unavailable; versioning information limited") + set(NO_GIT Off CACHE INTERNAL "" FORCE) + jl_set_option(NO_GIT Off) +endif() + +# TODO? Maybe make VERSION a configure file rather than reading it + +file(READ "${CMAKE_SOURCE_DIR}/VERSION" JULIA_VERSION) +# Trick to trigger re-configure when VERSION is edited. +configure_file(VERSION VERSION.cpy COPYONLY) +string(STRIP "${JULIA_VERSION}" JULIA_VERSION) + +jl_set_make_flag(JULIA_VERSION "${JULIA_VERSION}") + +if(NO_GIT) + set(JULIA_COMMIT "${JULIA_VERSION}") +else() + execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short=10 HEAD + OUTPUT_VARIABLE JULIA_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +jl_set_make_flag(JULIA_COMMIT "${JULIA_COMMIT}") + +if(NOT "${JULIA_VERSION}" MATCHES + "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(|-.*)$") + message(FATAL_ERROR "Invalid version string") +endif() + +set(JULIA_VERSION_MAJOR "${CMAKE_MATCH_1}") +set(JULIA_VERSION_MINOR "${CMAKE_MATCH_2}") +set(JULIA_VERSION_PATCH "${CMAKE_MATCH_2}") +if(CMAKE_MATCH_3 STREQUAL "") + set(JULIA_VERSION_IS_RELEASE 1) +else() + set(JULIA_VERSION_IS_RELEASE 0) +endif() + +set(VERSDIR "v${JULIA_VERSION_MAJOR}.${JULIA_VERSION_MINOR}") + +# TODO: Code bundled with Julia should be installed into a versioned directory, +# prefix/share/julia/VERSDIR, so that in the future one can have multiple +# major versions of Julia installed concurrently. Third-party code that +# is not controlled by Pkg should be installed into +# prefix/share/julia/site/VERSDIR (not prefix/share/julia/VERSDIR/site ... +# so that prefix/share/julia/VERSDIR can be overwritten without touching +# third-party code). + +jl_set_make_flag(VERSDIR "${VERSDIR}") diff --git a/cmake/jl_custom_target.cmake b/cmake/jl_custom_target.cmake new file mode 100644 index 0000000000000..b008464a60e63 --- /dev/null +++ b/cmake/jl_custom_target.cmake @@ -0,0 +1,73 @@ +# + +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +# OUTPUTS: list of output files +# OUTPUT_DEPS: list of direct dependencies +# AUTODEP_FILE: the file to read automatically generated dependencies list from +# COMMAND_SPEC: arguments passed to execute_process() + +set(output_str) +foreach(output ${OUTPUTS}) + if(IS_ABSOLUTE "${output}") + file(RELATIVE_PATH output "${CUR_BIN_DIR}" "${output}") + endif() + set(output_str "${output_str} ${output}") +endforeach() + +function(run_target) + message("${Blue}Generating${output_str}${ColourReset}") + execute_process(${COMMAND_SPEC} RESULT_VARIABLE res) + if(NOT "${res}" EQUAL 0) + file(REMOVE ${OUTPUTS}) + message(FATAL_ERROR + "${BoldRed}Error while generating${output_str}${ColourReset}") + endif() + if(EXISTS "${AUTODEP_FILE}") + file(RENAME "${AUTODEP_FILE}" "${AUTODEP_FILE}.autodeps") + else() + execute_process(COMMAND "${CMAKE_COMMAND}" + -E touch "${AUTODEP_FILE}.autodeps") + endif() +endfunction() + +set(dep_list ${OUTPUT_DEPS}) +if(NOT EXISTS "${AUTODEP_FILE}.autodeps") + # Use the autodeps file to check if the build succeeded last time + run_target() + return() +endif() +file(STRINGS "${AUTODEP_FILE}.autodeps" autodeps) +set(dep_list ${dep_list} ${autodeps}) + +foreach(output ${OUTPUTS}) + if(NOT EXISTS "${output}") + run_target() + return() + else() + foreach(dep ${dep_list}) + if("${dep}" IS_NEWER_THAN "${output}") + run_target() + return() + endif() + endforeach() + endif() +endforeach() diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt new file mode 100644 index 0000000000000..81bdf56b447c2 --- /dev/null +++ b/contrib/CMakeLists.txt @@ -0,0 +1,6 @@ +# + +set(stringreplace_SRCS + stringreplace.c) + +add_executable(stringreplace ${stringreplace_SRCS}) diff --git a/contrib/mac/app/Makefile b/contrib/mac/app/Makefile index 90ae14e829222..76a5ebd91a1bc 100644 --- a/contrib/mac/app/Makefile +++ b/contrib/mac/app/Makefile @@ -2,7 +2,6 @@ # You may have to wipe your openblas build to ensure that it is built # with support for all architectures, or else performance may suffer. -JULIAHOME = $(abspath ../../..) include ../../../Make.inc JULIA_PKGDIR=$(shell echo $$JULIA_PKGDIR) diff --git a/contrib/repackage_system_suitesparse4.make b/contrib/repackage_system_suitesparse4.make index 3a619d7935113..f0f791555201b 100755 --- a/contrib/repackage_system_suitesparse4.make +++ b/contrib/repackage_system_suitesparse4.make @@ -1,6 +1,5 @@ #!/usr/bin/make -f -JULIAHOME = $(abspath ..) include $(JULIAHOME)/Make.inc all: default diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt new file mode 100644 index 0000000000000..8ed646f40c178 --- /dev/null +++ b/deps/CMakeLists.txt @@ -0,0 +1,6 @@ +# + +add_custom_target(julia-deps + COMMAND make ${jl_make_flags} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS juliarc-jl julia-man1) diff --git a/deps/Makefile b/deps/Makefile index 093fbdb05e29e..35be02693df08 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -1,8 +1,14 @@ ## high-level setup ## -JULIAHOME = $(abspath ..) -include Versions.make include $(JULIAHOME)/Make.inc +INSTALL_F = $(JULIAHOME)/contrib/install.sh 644 +INSTALL_M = $(JULIAHOME)/contrib/install.sh 755 +JLDOWNLOAD = $(JULIAHOME)/deps/jldownload +JLCHECKSUM = $(JULIAHOME)/deps/jlchecksum +TAR=`which gtar 2>/dev/null || which tar 2>/dev/null` +RANLIB := ranlib +JFFLAGS = -O2 -fPIC + # Special comments: # # all targets in here should follow the same structure, @@ -42,11 +48,11 @@ CMAKE_COMMON = -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix) -DCMAKE_BUILD_TYPE=Re ifneq ($(VERBOSE), 0) CMAKE_COMMON += -DCMAKE_VERBOSE_MAKEFILE=ON endif -CMAKE_COMMON += -DCMAKE_C_COMPILER="$(CC_BASE)" +CMAKE_COMMON += -DCMAKE_C_COMPILER="$(CC)" ifneq ($(strip $(CMAKE_CC_ARG)),) CMAKE_COMMON += -DCMAKE_C_COMPILER_ARG1="$(CMAKE_CC_ARG)" endif -CMAKE_COMMON += -DCMAKE_CXX_COMPILER="$(CXX_BASE)" +CMAKE_COMMON += -DCMAKE_CXX_COMPILER="$(CXX)" ifneq ($(strip $(CMAKE_CXX_ARG)),) CMAKE_COMMON += -DCMAKE_CXX_COMPILER_ARG1="$(CMAKE_CXX_ARG)" endif @@ -276,11 +282,6 @@ LLVM_GIT_URL_LLDB ?= $(LLVM_GIT_URL_BASE)/lldb.git LLVM_GIT_URL_LIBCXX ?= $(LLVM_GIT_URL_BASE)/libcxx.git LLVM_GIT_URL_LIBCXXABI ?= $(LLVM_GIT_URL_BASE)/libcxxabi.git -ifeq ($(BUILD_LLDB), 1) -BUILD_LLVM_CLANG = 1 -# because it's a build requirement -endif - ifeq ($(LLVM_DEBUG),1) LLVM_BUILDTYPE = Debug else @@ -852,7 +853,7 @@ install-openspecfun: $(OPENSPECFUN_OBJ_TARGET) DSFMT_OBJ_TARGET = $(build_shlibdir)/libdSFMT.$(SHLIB_EXT) $(build_includedir)/dSFMT.h DSFMT_OBJ_SOURCE = dsfmt-$(DSFMT_VER)/libdSFMT.$(SHLIB_EXT) -DSFMT_CFLAGS = $(CFLAGS) -DNDEBUG -DDSFMT_MEXP=19937 $(fPIC) -DDSFMT_DO_NOT_USE_OLD_NAMES +DSFMT_CFLAGS = $(CFLAGS) -DNDEBUG -DDSFMT_MEXP=19937 -fPIC -DDSFMT_DO_NOT_USE_OLD_NAMES ifneq ($(USEMSVC), 1) DSFMT_CFLAGS += -O3 -finline-functions -fomit-frame-pointer -fno-strict-aliasing \ --param max-inline-insns-single=1800 -Wmissing-prototypes -Wall -std=c99 -shared @@ -1130,7 +1131,7 @@ endif endif libgfortblas.$(SHLIB_EXT): gfortblas.c gfortblas.alias - $(CC) -Wall -O3 $(CPPFLAGS) $(CFLAGS) $(fPIC) -shared $< -o $@ -pipe \ + $(CC) -Wall -O3 $(CPPFLAGS) $(CFLAGS) -fPIC -shared $< -o $@ -pipe \ -Wl,-reexport_framework,Accelerate -Wl,-alias_list,gfortblas.alias $(build_shlibdir)/libgfortblas.$(SHLIB_EXT): libgfortblas.$(SHLIB_EXT) cp -f $< $@ @@ -1565,7 +1566,7 @@ $(build_shlibdir)/libsuitesparse_wrapper.$(SHLIB_EXT): $(SUITESPARSE_OBJ_TARGET endif $(build_shlibdir)/libsuitesparse_wrapper.$(SHLIB_EXT): SuiteSparse_wrapper.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -O2 -shared $(fPIC) $(SUITESPARSE_INC) $< -o $@ $(SUITESPARSE_LIB) + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -O2 -shared -fPIC $(SUITESPARSE_INC) $< -o $@ $(SUITESPARSE_LIB) $(INSTALL_NAME_CMD)libsuitesparse_wrapper.$(SHLIB_EXT) $@ touch -c $@ @@ -1898,7 +1899,7 @@ LIBGIT2_OPTS += -DWIN32=ON -DMINGW=ON -DUSE_SSH=OFF -DCMAKE_SYSTEM_NAME=Windows ifeq ($(BUILD_OS),WINNT) LIBGIT2_OPTS += -G"MSYS Makefiles" else -LIBGIT2_OPTS += -DBUILD_CLAR=OFF -DCMAKE_RC_COMPILER=`which $(CROSS_COMPILE)windres` +LIBGIT2_OPTS += -DBUILD_CLAR=OFF -DCMAKE_RC_COMPILER=`which windres` LIBGIT2_OPTS += -DCMAKE_FIND_ROOT_PATH=/usr/$(XC_HOST) -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY endif endif diff --git a/deps/Versions.make b/deps/Versions.make deleted file mode 100644 index b735d8f6adec0..0000000000000 --- a/deps/Versions.make +++ /dev/null @@ -1,16 +0,0 @@ -LLVM_VER = 3.3 -LLVM_LIB_SUFFIX = -PCRE_VER = 10.20 -DSFMT_VER = 2.2.3 -LAPACK_VER = 3.5.0 -ARPACK_VER = 3.2.0 -FFTW_VER = 3.3.4 -SUITESPARSE_VER = 4.4.2 -UNWIND_VER = 1.1 -OSXUNWIND_VER = 0.0.1 -GMP_VER=6.0.0 -MPFR_VER=3.1.2 -PATCHELF_VER = 0.8 -GIT_VER = 1.8.5.6 -VIRTUALENV_VER = 1.11.6 -RMATH_JULIA_VER = 0.1 diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000000000..1eb00a4f80b55 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,5 @@ +# + +add_custom_target(julia-doc-html + COMMAND make html ${jl_make_flags} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/examples/Makefile b/examples/Makefile index 66d7210adfc91..45b84b1ce340f 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,11 +1,10 @@ -JULIAHOME = $(abspath ..) include $(JULIAHOME)/Make.inc FLAGS = -Wall -Wno-strict-aliasing -fno-omit-frame-pointer \ -I$(JULIAHOME)/src -I$(JULIAHOME)/src/support -I$(build_includedir) $(CFLAGS) -DEBUGFLAGS += $(FLAGS) -SHIPFLAGS += $(FLAGS) +override DEBUGFLAGS += $(FLAGS) +override SHIPFLAGS += $(FLAGS) JLDFLAGS += $(LDFLAGS) $(NO_WHOLE_ARCHIVE) $(call exec,$(LLVM_CONFIG) --ldflags) $(OSLIBS) $(RPATH) ifeq ($(USE_SYSTEM_LIBM),0) @@ -38,4 +37,3 @@ clean: | $(CLEAN_TARGETS) rm -f $(build_bindir)/embedding-debug $(build_bindir)/embedding .PHONY: clean release debug - diff --git a/src/.gitignore b/src/.gitignore index f681ce47fdd2c..b3ae41ba187c6 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -17,4 +17,3 @@ /libjulia-release.a /libjulia-release.so /libjulia-release.dylib -/julia_version.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000000..04451a8893299 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,103 @@ +# + +add_subdirectory(support) +add_subdirectory(flisp) + +set(FLISP_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/flisp/flisp") + +set(julia_flisp_boot_SRCS + julia-parser.scm + julia-syntax.scm + match.scm + utils.scm + jlfrontend.scm + mk_julia_flisp_boot.scm) + +set(julia_flisp_boot "${CMAKE_CURRENT_BINARY_DIR}/julia_flisp.boot") + +add_custom_command(OUTPUT "${julia_flisp_boot}" + COMMAND "${CMAKE_COMMAND}" -E env "julia_flisp.boot=${julia_flisp_boot}" + "${FLISP_EXECUTABLE}" ./mk_julia_flisp_boot.scm + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS ${julia_flisp_boot_SRCS} flmain) + +add_custom_target(julia_flisp_boot + DEPENDS "${julia_flisp_boot}" flmain) + +set(julia_flisp_boot_inc "${CMAKE_CURRENT_BINARY_DIR}/julia_flisp.boot.inc") + +#TODO make the input and output arguments or envs +add_custom_command(OUTPUT "${julia_flisp_boot_inc}" + COMMAND "${FLISP_EXECUTABLE}" ./bin2hex.scm < "${julia_flisp_boot}" + > "${julia_flisp_boot_inc}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + DEPENDS "${julia_flisp_boot}" flmain) + +add_custom_target(julia_flisp_boot_inc + DEPENDS "${julia_flisp_boot_inc}" julia_flisp_boot) + +set(libjulia_SRCS + jltypes.c + gf.c + ast.c + builtins.c + module.c + codegen.cpp + disasm.cpp + debuginfo.cpp + interpreter.c + alloc.c + dlload.c + sys.c + init.c + task.c + array.c + dump.c + toplevel.c + jl_uv.c + jlapi.c + profile.c + llvm-simdloop.cpp + simplevector.c + gc.c) + +push_c_flags(CMAKE_CXX_FLAGS ${LLVM_CXXFLAGS}) + +if(USE_LLVM_SHLIB) + set(LLVM_LINK ${LLVM_LDFLAGS} -lLLVM-${LLVM_VERSION}) + add_definitions(-DLLVM_SHLIB) +else() + set(LLVM_LINK + ${LLVM_LDFLAGS} ${LLVM_LIBS} ${LLVM_LDFLAGS} ${LLVM_SYSTEMLIBS}) +endif() + +include_directories(. "${CMAKE_CURRENT_BINARY_DIR}" + flisp support + ../deps/valgrind + "${LIBUV_INC}" + "${LLVM_INC}") + +add_definitions(-D_GNU_SOURCE -DLIBRARY_EXPORTS) +if(NOT USEMSVC) + add_definitions(-Wall -Wno-strict-aliasing -fno-omit-frame-pointer + -fvisibility=hidden -fno-common) +endif() + +if(USE_COPY_STACKS) + add_definitions(-DCOPY_STACKS) +endif() + +add_library(libjulia SHARED ${libjulia_SRCS}) + +set_target_properties(libjulia PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${build_shlibdir}" + OUTPUT_NAME "julia") + +add_dependencies(libjulia julia-deps julia_flisp_boot_inc) + +string(REPLACE " " ";" OS_LIBS "${OSLIBS}") + +target_link_libraries(libjulia ${WHOLE_ARCHIVE} flisp support + -L${build_shlibdir} -L${build_libdir} ${LIBUV} ${LIBUTF8PROC} + ${NO_WHOLE_ARCHIVE} ${LLVM_LINK} ${OS_LIBS} + -Wl,--no-undefined) diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 407083a00b14d..0000000000000 --- a/src/Makefile +++ /dev/null @@ -1,164 +0,0 @@ -JULIAHOME = $(abspath ..) -include $(JULIAHOME)/deps/Versions.make -include $(JULIAHOME)/Make.inc - -override CFLAGS += $(JCFLAGS) -override CXXFLAGS += $(JCXXFLAGS) -override CPPFLAGS += $(JCPPFLAGS) - -BUILDDIR ?= . - -SRCS = \ - jltypes gf ast builtins module codegen disasm debuginfo interpreter \ - alloc dlload sys init task array dump toplevel jl_uv jlapi profile llvm-simdloop simplevector - -HEADERS = julia.h julia_internal.h julia_version.h options.h $(wildcard support/*.h) $(LIBUV_INC)/uv.h - -FLAGS = \ - -D_GNU_SOURCE -Iflisp -Isupport \ - -I$(call exec,$(LLVM_CONFIG) --includedir) \ - -I$(LIBUV_INC) -I$(build_includedir) -DLIBRARY_EXPORTS \ - -I$(BUILDDIR) -I$(JULIAHOME)/deps/valgrind -ifneq ($(USEMSVC), 1) -FLAGS += -Wall -Wno-strict-aliasing -fno-omit-frame-pointer -fvisibility=hidden -fno-common -endif - -# In LLVM < 3.4, --ldflags includes both options and libraries, so use it both before and after --libs -# In LLVM >= 3.4, --ldflags has only options, and --system-libs has the libraries. -LLVMLINK = $(call exec,$(LLVM_CONFIG) --ldflags) $(call exec,$(LLVM_CONFIG) --libs) $(call exec,$(LLVM_CONFIG) --ldflags) $(call exec,$(LLVM_CONFIG) --system-libs 2> /dev/null) -ifeq ($(USE_LLVM_SHLIB),1) -LLVMLINK = $(call exec,$(LLVM_CONFIG) --ldflags) -lLLVM-$(call exec,$(LLVM_CONFIG) --version) -FLAGS += -DLLVM_SHLIB -endif - -COMMON_LIBS = -L$(build_shlibdir) -L$(build_libdir) $(LIBUV) $(LIBUTF8PROC) $(NO_WHOLE_ARCHIVE) $(LLVMLINK) $(OSLIBS) -DEBUG_LIBS = $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp-debug.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport-debug.a $(COMMON_LIBS) -RELEASE_LIBS = $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp.a $(WHOLE_ARCHIVE) $(BUILDDIR)/support/libsupport.a $(COMMON_LIBS) - -OBJS = $(SRCS:%=$(BUILDDIR)/%.o) -DOBJS = $(SRCS:%=$(BUILDDIR)/%.dbg.obj) -DEBUGFLAGS += $(FLAGS) -SHIPFLAGS += $(FLAGS) - -ifeq ($(JULIAGC),MARKSWEEP) -SRCS += gc -endif - -ifeq ($(USE_COPY_STACKS),1) -JCFLAGS += -DCOPY_STACKS -endif - -FLISP_EXECUTABLE_debug = $(BUILDDIR)/flisp/flisp-debug -FLISP_EXECUTABLE_release = $(BUILDDIR)/flisp/flisp -ifeq ($(OS),WINNT) -FLISP_EXECUTABLE = $(FLISP_EXECUTABLE_release) -else -FLISP_EXECUTABLE = $(FLISP_EXECUTABLE_$(JULIA_BUILD_MODE)) -endif - -default: $(JULIA_BUILD_MODE) # contains either "debug" or "release" -all: debug release - -release debug: %: libjulia-% - -$(BUILDDIR): - mkdir $(BUILDDIR) - -$(BUILDDIR)/%.o: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(SHIPFLAGS) $(DISABLE_ASSERTIONS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(DEBUGFLAGS) -c $< -o $@) -$(BUILDDIR)/%.o: %.cpp $(HEADERS) $(shell which $(LLVM_CONFIG)) | $(BUILDDIR) - @$(call PRINT_CC, $(CXX) $(call exec,$(LLVM_CONFIG) --cxxflags) $(CPPFLAGS) $(CXXFLAGS) $(SHIPFLAGS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: %.cpp $(HEADERS) $(shell which $(LLVM_CONFIG)) | $(BUILDDIR) - @$(call PRINT_CC, $(CXX) $(call exec,$(LLVM_CONFIG) --cxxflags) $(CPPFLAGS) $(CXXFLAGS) $(DEBUGFLAGS) -c $< -o $@) - -$(BUILDDIR)/julia_flisp.boot.inc: $(BUILDDIR)/julia_flisp.boot $(FLISP_EXECUTABLE) - @$(call PRINT_FLISP, $(call spawn,$(FLISP_EXECUTABLE)) ./bin2hex.scm < $< > $@) - -export julia_flisp.boot=$(BUILDDIR)/julia_flisp.boot -$(julia_flisp.boot): julia-parser.scm julia-syntax.scm \ - match.scm utils.scm jlfrontend.scm mk_julia_flisp_boot.scm $(FLISP_EXECUTABLE) - @$(call PRINT_FLISP, $(call spawn,$(FLISP_EXECUTABLE)) ./mk_julia_flisp_boot.scm) - -$(BUILDDIR)/ast.o $(BUILDDIR)/ast.dbg.obj: $(BUILDDIR)/julia_flisp.boot.inc flisp/*.h -$(BUILDDIR)/codegen.o $(BUILDDIR)/codegen.dbg.obj: intrinsics.cpp cgutils.cpp ccall.cpp abi_*.cpp -$(BUILDDIR)/builtins.o $(BUILDDIR)/builtins.dbg.obj: table.c - -$(BUILDDIR)/support/libsupport.a: support/*.h support/*.c - $(MAKE) -C support BUILDDIR='$(abspath $(BUILDDIR)/support)' - -$(BUILDDIR)/support/libsupport-debug.a: support/*.h support/*.c - $(MAKE) -C support debug BUILDDIR='$(abspath $(BUILDDIR)/support)' - -$(FLISP_EXECUTABLE_release): $(BUILDDIR)/flisp/libflisp.a -$(BUILDDIR)/flisp/libflisp.a: flisp/*.h flisp/*.c $(BUILDDIR)/support/libsupport.a - $(MAKE) -C flisp BUILDDIR='$(abspath $(BUILDDIR)/flisp)' - -$(FLISP_EXECUTABLE_debug): $(BUILDDIR)/flisp/libflisp-debug.a -$(BUILDDIR)/flisp/libflisp-debug.a: flisp/*.h flisp/*.c $(BUILDDIR)/support/libsupport-debug.a - $(MAKE) -C flisp debug BUILDDIR='$(abspath $(BUILDDIR)/flisp)' - -julia_version.h: ../VERSION - @echo "// This is an autogenerated header file" > $@.$(JULIA_BUILD_MODE).tmp - @echo "#ifndef JULIA_VERSION_H" >> $@.$(JULIA_BUILD_MODE).tmp - @echo "#define JULIA_VERSION_H" >> $@.$(JULIA_BUILD_MODE).tmp - @echo "#define JULIA_VERSION_STRING" \"$(JULIA_VERSION)\" >> $@.$(JULIA_BUILD_MODE).tmp - @echo $(JULIA_VERSION) | awk 'BEGIN {FS="[.,-]"} \ - {print "#define JULIA_VERSION_MAJOR " $$1 "\n" \ - "#define JULIA_VERSION_MINOR " $$2 "\n" \ - "#define JULIA_VERSION_PATCH " $$3 ; \ - if (NF<4) print "#define JULIA_VERSION_IS_RELEASE 1" ; else print "#define JULIA_VERSION_IS_RELEASE 0"}' >> $@.$(JULIA_BUILD_MODE).tmp - @echo "#endif" >> $@.$(JULIA_BUILD_MODE).tmp - mv $@.$(JULIA_BUILD_MODE).tmp $@ - -ifneq ($(USEMSVC), 1) -CXXLD = $(CXX) -shared -ifeq ($(OS),WINNT) -CXXLD += -Wl,--out-implib,$(build_libdir)/$(notdir $@).a -endif -else -CXXLD = $(LD) -dll -export:jl_setjmp -export:jl_longjmp -endif - -$(build_shlibdir)/libjulia-debug.$(SHLIB_EXT): julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a $(LIBUV) - @$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(DEBUGFLAGS) $(DOBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(JLIBLDFLAGS) $(DEBUG_LIBS)) - $(INSTALL_NAME_CMD)libjulia-debug.$(SHLIB_EXT) $@ - $(DSYMUTIL) $@ -$(BUILDDIR)/libjulia-debug.a: julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a - rm -f $@ - @$(call PRINT_LINK, ar -rcs $@ $(DOBJS)) -libjulia-debug: $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT) - -ifeq ($(SHLIB_EXT), so) - SONAME = -Wl,-soname=libjulia.so -else - SONAME = -endif - -$(build_shlibdir)/libjulia.$(SHLIB_EXT): julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV) - @$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(SHIPFLAGS) $(OBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(JLIBLDFLAGS) $(RELEASE_LIBS) $(SONAME)) $(CXXLDFLAGS) - $(INSTALL_NAME_CMD)libjulia.$(SHLIB_EXT) $@ - $(DSYMUTIL) $@ -$(BUILDDIR)/libjulia.a: julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a - rm -f $@ - @$(call PRINT_LINK, ar -rcs $@ $(OBJS)) -libjulia-release: $(build_shlibdir)/libjulia.$(SHLIB_EXT) - -clean: - -rm -f $(build_shlibdir)/libjulia* - -rm -f $(BUILDDIR)/julia_flisp.boot $(BUILDDIR)/julia_flisp.boot.inc - -rm -f $(BUILDDIR)/*.dbg.obj $(BUILDDIR)/*.o *~ $(BUILDDIR)/*.$(SHLIB_EXT) $(BUILDDIR)/*.a *# - -rm -f $(BUILDDIR)/julia_version.h - -clean-flisp: - -$(MAKE) -C flisp clean BUILDDIR='$(abspath $(BUILDDIR)/flisp)' - -clean-support: - -$(MAKE) -C support clean BUILDDIR='$(abspath $(BUILDDIR)/support)' - - -cleanall: clean clean-flisp clean-support - -.PHONY: debug release clean cleanall clean-* - diff --git a/src/ast.c b/src/ast.c index d4b3ff178dd30..717fbbc1ec334 100644 --- a/src/ast.c +++ b/src/ast.c @@ -26,7 +26,7 @@ extern "C" { #endif static uint8_t flisp_system_image[] = { -#include "julia_flisp.boot.inc" +#include }; static fltype_t *jvtype=NULL; diff --git a/src/flisp/CMakeLists.txt b/src/flisp/CMakeLists.txt new file mode 100644 index 0000000000000..7003750bb0d29 --- /dev/null +++ b/src/flisp/CMakeLists.txt @@ -0,0 +1,51 @@ +# + +set(flisp_SRCS flisp.c + builtins.c + string.c + equalhash.c + table.c + iostream.c + julia_extensions.c) + +if(USEMSVC) + set(flisp_SRCS ${flisp_SRCS} dirname.c) +endif() + +set(flmain_SRCS flmain.c) + +include_directories(../support ${LIBUV_INC} ${UTF8PROC_INC}) + +add_definitions(-DLIBRARY_EXPORT -DUTF8PROC_EXPORTS) + +if(NOT USEMSVC) + add_definitions(-Wall -Wno-strict-aliasing -DUSE_COMPUTED_GOTO + -fvisibility=hidden -pthread) +endif() + +add_library(flisp STATIC ${flisp_SRCS}) + +add_executable(flmain ${flmain_SRCS}) + +if(NOT WIN32) + target_link_libraries(flisp -pthread) + target_link_libraries(flmain -pthread) +endif() + +target_link_libraries(flisp ${LIBUV} ${UTF8PROC} support dl) +target_link_libraries(flmain flisp) + +# TODO? generate at compile time? +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/flisp.boot" + COMMAND "${CMAKE_COMMAND}" -E copy + "${CMAKE_CURRENT_SOURCE_DIR}/flisp.boot" + "${CMAKE_CURRENT_BINARY_DIR}/flisp.boot" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/flisp.boot") + +add_custom_target(flisp-boot + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/flisp.boot") + +set_target_properties(flmain PROPERTIES + OUTPUT_NAME flisp) + +add_dependencies(flmain flisp-boot) diff --git a/src/flisp/Makefile b/src/flisp/Makefile deleted file mode 100644 index bec862493544c..0000000000000 --- a/src/flisp/Makefile +++ /dev/null @@ -1,104 +0,0 @@ -JULIAHOME = $(abspath ../..) -include $(JULIAHOME)/Make.inc - -override CFLAGS += $(JCFLAGS) -override CXXFLAGS += $(JCXXFLAGS) -override CPPFLAGS += $(JCPPFLAGS) - -BUILDDIR ?= . - -NAME = flisp -EXENAME = $(NAME) -LIBTARGET = lib$(NAME) - -SRCS = flisp.c builtins.c string.c equalhash.c table.c iostream.c \ - julia_extensions.c -ifeq ($(USEMSVC), 1) -SRCS += dirname.c -endif - -HEADERS = $(wildcard *.h) $(LIBUV_INC)/uv.h - -OBJS = $(SRCS:%.c=$(BUILDDIR)/%.o) -DOBJS = $(SRCS:%.c=$(BUILDDIR)/%.dbg.obj) -LLTDIR = ../support -LLT_release = $(BUILDDIR)/$(LLTDIR)/libsupport.a -LLT_debug = $(BUILDDIR)/$(LLTDIR)/libsupport-debug.a -LIBFILES_release = $(LLT_release) $(LIBUV) $(LIBUTF8PROC) -LIBFILES_debug = $(LLT_debug) $(LIBUV) $(LIBUTF8PROC) -LIBS = -ifneq ($(OS),WINNT) -LIBS += -lpthread -endif - -FLAGS = -I$(LLTDIR) $(CFLAGS) $(HFILEDIRS:%=-I%) \ - -I$(LIBUV_INC) -I$(build_includedir) $(LIBDIRS:%=-L%) \ - -DLIBRARY_EXPORTS -DUTF8PROC_EXPORTS -ifneq ($(USEMSVC), 1) -FLAGS += -Wall -Wno-strict-aliasing -DUSE_COMPUTED_GOTO -fvisibility=hidden -endif - -DEBUGFLAGS += $(FLAGS) -SHIPFLAGS += $(FLAGS) - -default: release - -release: $(BUILDDIR)/$(EXENAME) - -debug: $(BUILDDIR)/$(EXENAME)-debug - -$(BUILDDIR): - mkdir $(BUILDDIR) - -$(BUILDDIR)/%.o: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(SHIPFLAGS) $(DISABLE_ASSERTIONS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(DEBUGFLAGS) -c $< -o $@) - -$(BUILDDIR)/flisp.o: flisp.c cvalues.c types.c flisp.h print.c read.c equal.c -$(BUILDDIR)/flisp.dbg.obj: flisp.c cvalues.c types.c flisp.h print.c read.c equal.c -$(BUILDDIR)/flmain.o: flmain.c flisp.h -$(BUILDDIR)/flmain.dbg.obj: flmain.c flisp.h - -$(LLT_release): $(LLTDIR)/*.h $(LLTDIR)/*.c - $(MAKE) -C $(LLTDIR) BUILDDIR='$(abspath $(BUILDDIR)/$(LLTDIR))' -$(LLT_debug): $(LLTDIR)/*.h $(LLTDIR)/*.c - $(MAKE) debug -C $(LLTDIR) BUILDDIR='$(abspath $(BUILDDIR)/$(LLTDIR))' - -$(BUILDDIR)/$(LIBTARGET)-debug.a: $(DOBJS) | $(BUILDDIR) - rm -rf $@ - @$(call PRINT_LINK, $(AR) -rcs $@ $(DOBJS)) - ln -sf $@ $(LIBTARGET).a - -$(BUILDDIR)/$(LIBTARGET).a: $(OBJS) | $(BUILDDIR) - rm -rf $@ - @$(call PRINT_LINK, $(AR) -rcs $@ $(OBJS)) - -ifneq ($(USEMSVC), 1) -CCLD = $(CC) -else -CCLD = $(LD) -endif - -$(BUILDDIR)/$(EXENAME)-debug: $(DOBJS) $(LIBFILES_debug) $(BUILDDIR)/$(LIBTARGET)-debug.a $(BUILDDIR)/flmain.dbg.obj - @$(call PRINT_LINK, $(CCLD) $(DEBUGFLAGS) $(DOBJS) $(BUILDDIR)/flmain.dbg.obj -o $@ $(BUILDDIR)/$(LIBTARGET).a $(LIBFILES_debug) $(LIBS) $(OSLIBS)) - -$(BUILDDIR)/$(EXENAME): $(OBJS) $(LIBFILES_release) $(BUILDDIR)/$(LIBTARGET).a $(BUILDDIR)/flmain.o | $(BUILDDIR)/flisp.boot - @$(call PRINT_LINK, $(CCLD) $(SHIPFLAGS) $(OBJS) $(BUILDDIR)/flmain.o -o $@ $(BUILDDIR)/$(LIBTARGET).a $(LIBFILES_release) $(LIBS) $(OSLIBS)) - -ifneq ($(BUILDDIR),.) -$(BUILDDIR)/flisp.boot: flisp.boot - cp $< $@ -endif - -test: -ifneq ($(USEMSVC), 1) - $(call spawn,./$(EXENAME)) unittest.lsp -endif - -clean: - rm -f $(BUILDDIR)/*.o - rm -f $(BUILDDIR)/*.dbg.obj - rm -f $(BUILDDIR)/*.a - rm -f $(BUILDDIR)/$(EXENAME) - rm -f $(BUILDDIR)/$(EXENAME)-debug diff --git a/src/init.c b/src/init.c index bd4a2b9d6ba04..922ce8ac20467 100644 --- a/src/init.c +++ b/src/init.c @@ -5,6 +5,7 @@ system initialization and global state */ #include "platform.h" +#include #include #include @@ -120,6 +121,7 @@ jl_options_t jl_options = { 0, // quiet NULL, // outputbc NULL, // outputo NULL, // outputji + NULL // load_log }; int jl_boot_file_loaded = 0; @@ -901,7 +903,7 @@ int isabspath(const char *in) return 0; // relative path } -static char *abspath(const char *in) +char *abspath(const char *in) { // compute an absolute path location, so that chdir doesn't change the file reference #ifndef _OS_WINDOWS_ char *out = realpath(in, NULL); @@ -994,6 +996,8 @@ static void jl_resolve_sysimg_location(JL_IMAGE_SEARCH rel) jl_options.machinefile = abspath(jl_options.machinefile); if (jl_options.load) jl_options.load = abspath(jl_options.load); + if (jl_options.load_log) + jl_options.load_log = abspath(jl_options.load_log); } #ifdef _OS_DARWIN_ diff --git a/src/julia-config-p.h.in b/src/julia-config-p.h.in new file mode 100644 index 0000000000000..ab7d2f9fe56c4 --- /dev/null +++ b/src/julia-config-p.h.in @@ -0,0 +1,9 @@ +// + +#ifndef JULIA_CONFIG_P_H +#define JULIA_CONFIG_P_H + +#define JL_SYSTEM_IMAGE_PATH "@JL_SYSTEM_IMAGE_PATH@" +#define JL_BUILD_BASE_PATH "@CMAKE_BINARY_DIR@/base" + +#endif diff --git a/src/julia-config.h.in b/src/julia-config.h.in new file mode 100644 index 0000000000000..c4dde9cef59be --- /dev/null +++ b/src/julia-config.h.in @@ -0,0 +1,12 @@ +// + +#ifndef JULIA_CONFIG_H +#define JULIA_CONFIG_H + +#define JULIA_VERSION_STRING "@JULIA_VERSION@" +#define JULIA_VERSION_MAJOR @JULIA_VERSION_MAJOR@ +#define JULIA_VERSION_MINOR @JULIA_VERSION_MINOR@ +#define JULIA_VERSION_PATCH @JULIA_VERSION_PATCH@ +#define JULIA_VERSION_IS_RELEASE @JULIA_VERSION_IS_RELEASE@ + +#endif diff --git a/src/julia.h b/src/julia.h index 4360d70fcc0ef..2da8dcf200c40 100644 --- a/src/julia.h +++ b/src/julia.h @@ -1522,6 +1522,7 @@ typedef struct { const char *outputbc; const char *outputo; const char *outputji; + const char *load_log; } jl_options_t; extern DLLEXPORT jl_options_t jl_options; @@ -1566,9 +1567,6 @@ DLLEXPORT int jl_generating_output(); #define JL_OPTIONS_USE_PRECOMPILED_YES 1 #define JL_OPTIONS_USE_PRECOMPILED_NO 0 -// Version information -#include "julia_version.h" - DLLEXPORT extern int jl_ver_major(void); DLLEXPORT extern int jl_ver_minor(void); DLLEXPORT extern int jl_ver_patch(void); diff --git a/src/julia_internal.h b/src/julia_internal.h index 09a2e675344d4..0bb407b4bac2f 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -135,6 +135,7 @@ jl_function_t *jl_get_specialization(jl_function_t *f, jl_tupletype_t *types); jl_function_t *jl_module_get_initializer(jl_module_t *m); void jl_generate_fptr(jl_function_t *f); void jl_fptr_to_llvm(void *fptr, jl_lambda_info_t *lam, int specsig); +char *abspath(const char *in); jl_value_t* skip_meta(jl_array_t *body); diff --git a/src/options.h b/src/options.h index f459661a254d7..09b905c0ad397 100644 --- a/src/options.h +++ b/src/options.h @@ -3,6 +3,8 @@ #ifndef JL_OPTIONS_H #define JL_OPTIONS_H +#include + // Build-time options for debugging, tweaking, and selecting alternative // implementations of core features. diff --git a/src/support/CMakeLists.txt b/src/support/CMakeLists.txt new file mode 100644 index 0000000000000..150263a91bbbe --- /dev/null +++ b/src/support/CMakeLists.txt @@ -0,0 +1,42 @@ +# + +set(libsupport_SRCS + hashing.c + timefuncs.c + ptrhash.c + operators.c + utf8.c + ios.c + htable.c + bitvector.c + int2str.c + libsupportinit.c + arraylist.c + strtod.c) + +if(WIN32) + set(libsupport_SRCS ${libsupport_SRCS} asprintf.c) + enable_language(ASM_MASM) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(libsupport_SRCS ${libsupport_SRCS} _setjmp.win64.S _longjmp.win64.S) + set_source_files_properties(_setjmp.win64.S _longjmp.win64.S PROPERTIES + LANGUAGE ASM_MASM) + else() + set(libsupport_SRCS ${libsupport_SRCS} _setjmp.win32.S _longjmp.win32.S) + set_source_files_properties(_setjmp.win32.S _longjmp.win32.S PROPERTIES + LANGUAGE ASM_MASM) + endif() +endif() + +add_definitions(-DLIBRARY_EXPORTS -DUTF8PROC_EXPORTS) +include_directories(${LIBUV_INC} ${UTF8PROC_INC}) +if(NOT USEMSVC) + add_definitions(-Wall -Wno-strict-aliasing -fvisibility=hidden) +endif() + +add_library(support STATIC + ${libsupport_SRCS}) + +add_dependencies(support julia-deps) + +target_link_libraries(support ${LIBUV} ${LIBUTF8PROC}) diff --git a/src/support/Makefile b/src/support/Makefile deleted file mode 100644 index 35f8b3765fc62..0000000000000 --- a/src/support/Makefile +++ /dev/null @@ -1,78 +0,0 @@ -JULIAHOME = $(abspath ../..) -include $(JULIAHOME)/Make.inc - -override CFLAGS += $(JCFLAGS) -override CXXFLAGS += $(JCXXFLAGS) -override CPPFLAGS += $(JCPPFLAGS) - -BUILDDIR ?= . - -SRCS = hashing timefuncs ptrhash operators \ - utf8 ios htable bitvector \ - int2str libsupportinit arraylist strtod -ifeq ($(OS),WINNT) -SRCS += asprintf -ifeq ($(ARCH),i686) -SRCS += _setjmp.win32 _longjmp.win32 -else ifeq ($(ARCH),i386) -SRCS += _setjmp.win32 _longjmp.win32 -else ifeq ($(ARCH),x86_64) -SRCS += _setjmp.win64 _longjmp.win64 -endif -endif - -HEADERS = $(wildcard *.h) $(LIBUV_INC)/uv.h - -OBJS = $(SRCS:%=$(BUILDDIR)/%.o) -DOBJS = $(SRCS:%=$(BUILDDIR)/%.dbg.obj) - -FLAGS = $(CFLAGS) $(HFILEDIRS:%=-I%) -I$(LIBUV_INC) -I$(UTF8PROC_INC) -DLIBRARY_EXPORTS -DUTF8PROC_EXPORTS -ifneq ($(USEMSVC), 1) -FLAGS += -Wall -Wno-strict-aliasing -fvisibility=hidden -endif - -DEBUGFLAGS += $(FLAGS) -SHIPFLAGS += $(FLAGS) - -default: release - -$(BUILDDIR): - mkdir $(BUILDDIR) - -$(BUILDDIR)/%.o: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(SHIPFLAGS) $(DISABLE_ASSERTIONS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: %.c $(HEADERS) | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(DEBUGFLAGS) -c $< -o $@) -ifneq ($(USEMSVC), 1) -$(BUILDDIR)/%.o: %.S | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(SHIPFLAGS) -c $< -o $@) -$(BUILDDIR)/%.dbg.obj: %.S | $(BUILDDIR) - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(DEBUGFLAGS) -c $< -o $@) -else -$(BUILDDIR)/%.o: %.S | $(BUILDDIR) - @$(call PRINT_CC, $(CPP) -P $(CPPFLAGS) $(SHIPFLAGS) $<) - @$(call PRINT_CC, $(AS) $(CPPFLAGS) $(SHIPFLAGS) -Fo $@ -c $*.i) -$(BUILDDIR)/%.dbg.obj: %.S | $(BUILDDIR) - @$(call PRINT_CC, $(CPP) -P $(CPPFLAGS) $(DEBUGFLAGS) $<) - @$(call PRINT_CC, $(AS) $(CPPFLAGS) $(DEBUGFLAGS) -Fo $@ -c $*.i) -endif - -release: $(BUILDDIR)/libsupport.a -debug: $(BUILDDIR)/libsupport-debug.a - -$(BUILDDIR)/libsupport.a: $(OBJS) - rm -rf $@ - @$(call PRINT_LINK, $(AR) -rcs $@ $^) - -$(BUILDDIR)/libsupport-debug.a: $(DOBJS) - rm -rf $@ - @$(call PRINT_LINK, $(AR) -rcs $@ $^) - -clean: - rm -f $(BUILDDIR)/*.o - rm -f $(BUILDDIR)/*.dbg.obj - rm -f $(BUILDDIR)/*.a - rm -f $(BUILDDIR)/*~ *# - rm -f $(BUILDDIR)/core* - rm -f $(BUILDDIR)/libsupport.a - rm -f $(BUILDDIR)/libsupport-debug.a diff --git a/src/toplevel.c b/src/toplevel.c index 9d0afe6d059da..37334509f558a 100644 --- a/src/toplevel.c +++ b/src/toplevel.c @@ -18,12 +18,18 @@ #endif #include "julia.h" #include "julia_internal.h" +#include #include "uv.h" +#include #ifdef __cplusplus extern "C" { #endif +extern int asprintf(char **str, const char *fmt, ...); + +static volatile char jl_build_base_path[] = JL_BUILD_BASE_PATH; + // current line number in a file DLLEXPORT int jl_lineno = 0; // current file name @@ -589,6 +595,27 @@ jl_value_t *jl_parse_eval_all(const char *fname, size_t len) return result; } +static int +jl_is_regfile(const char *fname) +{ + uv_stat_t stbuf; + return (jl_stat(fname, (char*)&stbuf) == 0 && + (stbuf.st_mode & S_IFMT) == S_IFREG); +} + +static void +jl_log_deps(const char *_fpath) +{ + static FILE *log_file = NULL; + if (!log_file) { + log_file = fopen(jl_options.load_log, "w"); + } + char *fpath = abspath(_fpath); + fprintf(log_file, "%s\n", fpath); + free(fpath); + fflush(log_file); +} + jl_value_t *jl_load(const char *fname) { if (jl_current_module->istopmod) { @@ -597,16 +624,27 @@ jl_value_t *jl_load(const char *fname) uv_run(uv_default_loop(), (uv_run_mode)1); #endif } - char *fpath = (char*)fname; - uv_stat_t stbuf; - if (jl_stat(fpath, (char*)&stbuf) != 0 || (stbuf.st_mode & S_IFMT) != S_IFREG) { - jl_errorf("could not open file %s", fpath); + char *fpath = NULL; + if (!jl_is_regfile(fname)) { + if (jl_build_base_path[0]) { + asprintf(&fpath, "%s/%s", jl_build_base_path, fname); + if (!jl_is_regfile(fpath)) { + free(fpath); + jl_errorf("could not open file %s", fname); + } + fname = fpath; + } else { + jl_errorf("could not open file %s", fname); + } + } + if (jl_start_parsing_file(fname) != 0) { + jl_errorf("could not open file %s", fname); } - if (jl_start_parsing_file(fpath) != 0) { - jl_errorf("could not open file %s", fpath); + if (jl_options.load_log) { + jl_log_deps(fname); } - jl_value_t *result = jl_parse_eval_all(fpath, strlen(fpath)); - if (fpath != fname) free(fpath); + jl_value_t *result = jl_parse_eval_all(fname, strlen(fname)); + free(fpath); return result; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000000000..ba07bdeb6d0bc --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,9 @@ +# + +set(libccalltest_SRCS + ccalltest.c) + +add_definitions("-DCC=${CMAKE_C_COMPILER}") + +# TODO make ccall test work with this +add_library(libccalltest MODULE ${libccalltest_SRCS}) diff --git a/test/Makefile b/test/Makefile index c7848e0644c45..3f603e5f758c9 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,25 +1,12 @@ -JULIAHOME = $(abspath ..) include ../Make.inc -TESTS = all linalg $(filter-out TestHelpers runtests testdefs,$(subst .jl,,$(wildcard *.jl linalg/*.jl))) - default: all -$(TESTS): - @$(call PRINT_JULIA, $(call spawn,$(JULIA_EXECUTABLE)) --check-bounds=yes --startup-file=no ./runtests.jl $@) - -perf: - @$(MAKE) -C perf all - -clean: - @$(MAKE) -C perf $@ - -rm -f libccalltest.$(SHLIB_EXT) ccalltest - -.PHONY: $(TESTS) perf clean libccalltest +.PHONY: libccalltest -all ccall libccalltest: libccalltest.$(SHLIB_EXT) +all libccalltest: libccalltest.$(SHLIB_EXT) libccalltest.$(SHLIB_EXT): ccalltest.c - @$(call PRINT_CC, $(CC) $(CFLAGS) $(DEBUGFLAGS) -O3 $< $(fPIC) -shared -o $@ $(LDFLAGS) -DCC="$(CC)") + @$(call PRINT_CC, $(CC) $(CFLAGS) $(DEBUGFLAGS) -O3 $< -fPIC -shared -o $@ $(LDFLAGS) -DCC="$(CC)") ccalltest: ccalltest.c libccalltest.$(SHLIB_EXT) @$(call PRINT_CC, $(CC) $(CFLAGS) $(DEBUGFLAGS) -O3 $< -o $@ $(LDFLAGS) -DCC="$(CC)") diff --git a/test/perf/Makefile b/test/perf/Makefile index 848dfbcbe3f28..20f68cf7332c2 100644 --- a/test/perf/Makefile +++ b/test/perf/Makefile @@ -1,4 +1,3 @@ -JULIAHOME = $(abspath ../..) include ../../Make.inc all: micro kernel cat shootout blas lapack simd sort spell sparse diff --git a/test/perf/micro/Makefile b/test/perf/micro/Makefile index ef7bbe80472d1..ec82507a69bdf 100644 --- a/test/perf/micro/Makefile +++ b/test/perf/micro/Makefile @@ -1,6 +1,5 @@ JULIAHOME = $(abspath ../../..) include $(JULIAHOME)/Make.inc -include $(JULIAHOME)/deps/Versions.make NODEJSBIN = nodejs @@ -45,7 +44,7 @@ export OMP_NUM_THREADS=1 export GOTO_NUM_THREADS=1 export OPENBLAS_NUM_THREADS=1 -perf.h: $(JULIAHOME)/deps/Versions.make +perf.h: $(JULIAHOME)/cmake/JuliaDeps.cmake echo '#include "$(BLASDIR)cblas.h"' > $@ echo '#include "$(DSFMTDIR)/dSFMT.c"' >> $@ echo '#include "$(RMATHDIR)/src/randmtzig.c"' >> $@ diff --git a/test/perf/shootout/Makefile b/test/perf/shootout/Makefile index 622e92708e0b9..dcd0373cdd8cd 100644 --- a/test/perf/shootout/Makefile +++ b/test/perf/shootout/Makefile @@ -1,6 +1,7 @@ -JULIAHOME = $(abspath ../../..) include ../../../Make.inc +JLDOWNLOAD = $(JULIAHOME)/deps/jldownload + SHOOTOUTFILES = knucleotide-input.txt regexdna-input.txt revcomp-input.txt fasta-output.txt mandelbrot-output.txt nbody-output.txt fannkuchredux-output.txt pidigits-output.txt knucleotide-output.txt revcomp-output.txt spectralnorm-output.txt regexdna-output.txt meteor-output.txt getall: $(SHOOTOUTFILES) diff --git a/test/version.jl b/test/version.jl index f732636b96140..a05d98f5f27af 100644 --- a/test/version.jl +++ b/test/version.jl @@ -226,7 +226,7 @@ io = IOBuffer() @test banner(io) == nothing @test length(takebuf_string(io)) > 50 -# julia_version.h version test +# Julia C version test @test VERSION.major == ccall(:jl_ver_major, Cint, ()) @test VERSION.minor == ccall(:jl_ver_minor, Cint, ()) @test VERSION.patch == ccall(:jl_ver_patch, Cint, ()) diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt new file mode 100644 index 0000000000000..68eb352acde84 --- /dev/null +++ b/ui/CMakeLists.txt @@ -0,0 +1,62 @@ +# + +set(julia_ui_SRCS + repl.c) + +if(USEMSVC) + set(julia_ui_SRCS + ${julia_ui_SRCS} + getopt.c) +endif() + +include_directories(../src + ../src/support + ${build_includedir}) + +if(NOT USEMSVC) + add_definitions(-Wall -Wno-strict-aliasing -fno-omit-frame-pointer) +endif() + +# TODO llvm_shlib... +# push_c_flags(JL_LD_FLAGS ${NO_WHOLE_ARCHIVE} ${OSLIBS}) + +if(NOT USE_SYSTEM_LIBM AND UNTRUSTED_SYSTEM_LIBM) + push_c_flags(JL_LD_FLAGS ${WHOLE_ARCHIVE} ${build_libdir}/libopenlibm.a + ${NO_WHOLE_ARCHIVE}) +endif() + +if(WIN32) + push_c_flags(JL_LD_FLAGS -municode) +endif() + +add_executable(julia-ui ${julia_ui_SRCS}) +set_target_properties(julia-ui PROPERTIES + OUTPUT_NAME julia + RUNTIME_OUTPUT_DIRECTORY "${build_bindir}") + +string(REPLACE " " ";" ldflags "${JL_LD_FLAGS}") + +target_link_libraries(julia-ui ${ldflags} libjulia) + +if(UNIX) + add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/julia" + COMMAND "${CMAKE_COMMAND}" -E create_symlink "${build_bindir}/julia" + "${CMAKE_BINARY_DIR}/julia") + add_custom_target(julia_symlink DEPENDS "${CMAKE_BINARY_DIR}/julia") +else() + add_custom_target(julia_symlink) +endif() + +if(WIN32 AND NOT USEMSVC) + set(windows_julia_rc "${CMAKE_SOURCE_DIR}/contrib/windows/julia.rc") + set(julia_res_o "${CMAKE_CURRENT_BINARY_DIR}/julia_res.o") + set(jlver + "${JULIA_VERSION_MAJOR},${JULIA_VERSION_MINOR},0,${JULIA_VERSION_PATCH}") + add_custom_command(OUTPUT "${julia_res_o}" + COMMAND windres "${windows_julia_rc}" -O coff -o "${julia_res_o}" + -DJLVER=${jlver} "-DJLVER_STR=\"${JULIA_VERSION}\"" + DEPENDS "${windows_julia_rc}") + add_custom_target(julia_res_o DEPENDS "${julia_res_o}") + add_dependencies(julia-ui julia_res_o) + target_link_libraries("${julia_res_o}") +endif() diff --git a/ui/Makefile b/ui/Makefile deleted file mode 100644 index 9f64bb721cb4c..0000000000000 --- a/ui/Makefile +++ /dev/null @@ -1,81 +0,0 @@ -JULIAHOME = $(abspath ..) -include $(JULIAHOME)/deps/Versions.make -include $(JULIAHOME)/Make.inc - -override CFLAGS += $(JCFLAGS) -override CXXFLAGS += $(JCXXFLAGS) -override CPPFLAGS += $(JCPPFLAGS) - -SRCS = repl -ifeq ($(USEMSVC), 1) -SRCS += getopt -endif - -FLAGS = -I$(JULIAHOME)/src -I$(JULIAHOME)/src/support -I$(build_includedir) -ifneq ($(USEMSVC), 1) -FLAGS += -Wall -Wno-strict-aliasing -fno-omit-frame-pointer -endif - -OBJS = $(SRCS:%=%.o) -DOBJS = $(SRCS:%=%.dbg.obj) -DEBUGFLAGS += $(FLAGS) -SHIPFLAGS += $(FLAGS) -ifeq ($(USE_LLVM_SHLIB),1) -LLVMLINK = $(call exec,$(LLVM_CONFIG) --ldflags) -lLLVM-$(call exec,$(LLVM_CONFIG) --version) -else -LLVMLINK = -endif -JLDFLAGS += $(LDFLAGS) $(NO_WHOLE_ARCHIVE) $(OSLIBS) $(LLVMLINK) $(RPATH) - -ifeq ($(USE_SYSTEM_LIBM),0) -ifneq ($(UNTRUSTED_SYSTEM_LIBM),0) -JLDFLAGS += $(WHOLE_ARCHIVE) $(build_libdir)/libopenlibm.a $(NO_WHOLE_ARCHIVE) -endif -endif - -ifeq ($(OS),WINNT) -JLDFLAGS += -municode -endif - -default: release -all: release debug -release debug : % : julia-% - -%.o: %.c - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(SHIPFLAGS) -c $< -o $@) -%.dbg.obj: %.c - @$(call PRINT_CC, $(CC) $(CPPFLAGS) $(CFLAGS) $(DEBUGFLAGS) -c $< -o $@) - -ifeq ($(OS),WINNT) -ifneq ($(USEMSVC), 1) -julia_res.o: $(JULIAHOME)/contrib/windows/julia.rc - JLVER=`cat $(JULIAHOME)/VERSION` && \ - JLVERi=`echo $$JLVER | perl -nle \ - '/^(\d+)\.?(\d*)\.?(\d*)/ && \ - print int $$1,",",int $$2,",0,",int $$3'` && \ - $(CROSS_COMPILE)windres $< -O coff -o $@ -DJLVER=$$JLVERi -DJLVER_STR=\\\"$$JLVER\\\" -$(build_bindir)/julia$(EXE): julia_res.o -$(build_bindir)/julia-debug$(EXE): julia_res.o -endif -endif - -julia-release: $(build_bindir)/julia$(EXE) -julia-debug: $(build_bindir)/julia-debug$(EXE) - -ifneq ($(USEMSVC), 1) -CXXLD = $(CXX) -else -CXXLD = $(LD) -endif - -$(build_bindir)/julia$(EXE): $(OBJS) - @$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(LINK_FLAGS) $(SHIPFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia $(JLDFLAGS) $(CXXLDFLAGS)) -$(build_bindir)/julia-debug$(EXE): $(DOBJS) - @$(call PRINT_LINK, $(CXXLD) $(CXXFLAGS) $(CXXLDFLAGS) $(LINK_FLAGS) $(DEBUGFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia-debug $(JLDFLAGS) $(CXXLDFLAGS)) - -clean: | $(CLEAN_TARGETS) - rm -f *.o *.dbg.obj - rm -f $(build_bindir)/julia* - -.PHONY: clean release debug julia-release julia-debug - diff --git a/ui/repl.c b/ui/repl.c index 7e7dbfe868b0d..dfbb72e09b00b 100644 --- a/ui/repl.c +++ b/ui/repl.c @@ -30,10 +30,6 @@ #define WHOLE_ARCHIVE #include "../src/julia.h" -#ifndef JL_SYSTEM_IMAGE_PATH -#error "JL_SYSTEM_IMAGE_PATH not defined!" -#endif - #ifdef __cplusplus extern "C" { #endif @@ -117,7 +113,8 @@ void parse_opts(int *argcp, char ***argvp) opt_handle_signals, opt_output_o, opt_output_ji, - opt_use_precompiled + opt_use_precompiled, + opt_load_log }; static char* shortopts = "+vhqFfH:e:E:P:L:J:C:ip:Ob:"; static struct option longopts[] = { @@ -150,6 +147,7 @@ void parse_opts(int *argcp, char ***argvp) { "output-bc", required_argument, 0, opt_output_bc }, { "output-o", required_argument, 0, opt_output_o }, { "output-ji", required_argument, 0, opt_output_ji }, + { "load-log", required_argument, 0, opt_load_log }, { "depwarn", required_argument, 0, opt_depwarn }, { "inline", required_argument, 0, opt_inline }, { "math-mode", required_argument, 0, opt_math_mode }, @@ -334,6 +332,9 @@ void parse_opts(int *argcp, char ***argvp) jl_options.outputji = optarg; if (!imagepathspecified) jl_options.image_file = NULL; break; + case opt_load_log: + jl_options.load_log = optarg; + break; case opt_depwarn: if (!strcmp(optarg,"yes")) jl_options.depwarn = JL_OPTIONS_DEPWARN_ON;