Skip to content

Commit

Permalink
WIP: Add ability to build a custom libcxx
Browse files Browse the repository at this point in the history
This is useful when compiling on a system with an outdated std c++ library,
but you need to build llvm, or when wanting to build julia with msan.
  • Loading branch information
Keno committed Aug 12, 2014
1 parent aa9baa1 commit f38b485
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 26 deletions.
16 changes: 13 additions & 3 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,12 @@ DEBUGFLAGS = -O0 -ggdb3 -DJL_DEBUG_BUILD -fstack-protector-all
SHIPFLAGS = -O3 -g -falign-functions
endif

ifneq ($(USEICC),1)
JCFLAGS += -m$(BINARY)
JCXXFLAGS += -m$(BINARY)
JFFLAGS += -m$(BINARY)
endif

ifeq ($(LLVM_VER),svn)
JCXXFLAGS += -std=c++11
endif
Expand Down Expand Up @@ -431,9 +437,6 @@ BINARY=64
else
$(error "unknown word-size for arch: $(ARCH)")
endif
CC += -m$(BINARY)
CXX += -m$(BINARY)
FC += -m$(BINARY)

ifeq ($(USEGCC),1)
ifneq ($(ARCH), ppc64)
Expand Down Expand Up @@ -692,6 +695,13 @@ LIBBLASNAME = libsatlas
LIBLAPACKNAME = $(LIBBLASNAME)
endif

# Custom libcxx
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
LDFLAGS += -L$(build_libdir) -lc++abi
CXXLDFLAGS += -L$(build_libdir) -lc++abi -stdlib=libc++
CPPFLAGS += -I$(build_includedir)/c++/v1
endif

# Make tricks

define dir_target
Expand Down
76 changes: 58 additions & 18 deletions deps/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ LLVM_GIT_URL_LLVM ?= $(LLVM_GIT_URL_BASE)/llvm.git
LLVM_GIT_URL_CLANG ?= $(LLVM_GIT_URL_BASE)/clang.git
LLVM_GIT_URL_COMPILER_RT ?= $(LLVM_GIT_URL_BASE)/compiler-rt.git
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
Expand Down Expand Up @@ -197,11 +199,9 @@ LLVM_COMPILER_RT_TAR=
else ifeq ($(LLVM_VER), 3.3)
LLVM_CLANG_TAR=cfe-$(LLVM_VER).src.tar.gz
LLVM_COMPILER_RT_TAR=compiler-rt-$(LLVM_VER).src.tar.gz
LLVM_LIBCXX_TAR=libcxx-$(LLVM_VER).src.tar.gz
else
LLVM_CLANG_TAR=clang-$(LLVM_VER).src.tar.gz
LLVM_COMPILER_RT_TAR=compiler-rt-$(LLVM_VER).src.tar.gz
LLVM_LIBCXX_TAR=libcxx-$(LLVM_VER).src.tar.gz
endif
else
LLVM_CLANG_TAR=
Expand All @@ -210,7 +210,15 @@ LLVM_LIBCXX_TAR=
endif
endif

LLVM_CXXFLAGS =
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
ifneq ($(LLVM_VER),svn)
LLVM_LIBCXX_TAR=libcxx-$(LLVM_VER).src.tar.gz
endif
endif

LLVM_CXXFLAGS = $(CXXFLAGS)
LLVM_CPPFLAGS =
LLVM_LDFLAGS = $(LDFLAGS)
LLVM_TARGET_FLAGS= --enable-targets=host
LLVM_FLAGS += --disable-profiling --enable-shared --enable-static $(LLVM_TARGET_FLAGS) --disable-bindings --disable-docs
LLVM_MFLAGS =
Expand All @@ -232,7 +240,7 @@ LLVM_FLAGS += --enable-libcpp
endif
ifeq ($(OS), WINNT)
LLVM_FLAGS += --with-extra-ld-options="-Wl,--stack,8388608" LDFLAGS="" --disable-shared
LLVM_MFLAGS += CPPFLAGS="-D__USING_SJLJ_EXCEPTIONS__ -D__CRT__NO_INLINE"
LLVM_CPPFLAGS += -D__USING_SJLJ_EXCEPTIONS__ -D__CRT__NO_INLINE
endif
ifeq ($(USE_INTEL_JITEVENTS), 1)
LLVM_FLAGS += --with-intel-jitevents
Expand Down Expand Up @@ -260,7 +268,8 @@ endif


ifeq ($(LLVM_SANITIZE),1)
LLVM_CC = CFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address"
LLVM_CC = CFLAGS="-fsanitize=address"
LLVM_LDFLAGS += -fsanitize=address
LLVM_CXXFLAGS += -fsanitize=address
LLVM_MFLAGS += TOOL_NO_EXPORTS= HAVE_LINK_VERSION_SCRIPT=0
else
Expand All @@ -273,6 +282,13 @@ LLVM_MFLAGS += CXXFLAGS="$(LLVM_CXXFLAGS)"
endif
LLVM_MFLAGS += $(LLVM_CC)

ifeq ($(BUILD_CUSTOM_LIBCXX),1)
LLVM_LDFLAGS += -Wl,-R$(build_libdir)
endif

LLVM_FLAGS += CPPFLAGS="$(CPPFLAGS) $(LLVM_CPPFLAGS)" LDFLAGS="$(LLVM_LDFLAGS)"
LLVM_MFLAGS += CPPFLAGS="$(CPPFLAGS) $(LLVM_CPPFLAGS)" LDFLAGS="$(LLVM_LDFLAGS)"

ifneq ($(LLVM_CLANG_TAR),)
$(LLVM_CLANG_TAR):
$(JLDOWNLOAD) $@ http://llvm.org/releases/$(LLVM_VER)/$@
Expand Down Expand Up @@ -308,14 +324,47 @@ else
LLVM_FLAGS += --with-python="$(shell ./find_python_for_llvm)"
endif

llvm-$(LLVM_VER)/configure: $(LLVM_TAR) $(LLVM_CLANG_TAR) $(LLVM_COMPILER_RT_TAR) $(LLVM_LIBCXX_TAR)
ifeq ($(BUILD_CUSTOM_LIBCXX),1)
llvm-$(LLVM_VER)/projects/libcxx: $(LLVM_LIBCXX_TAR)
([ ! -d llvm-$(LLVM_VER)/projects/libcxx ] && \
git clone $(LLVM_GIT_URL_LIBCXX) llvm-$(LLVM_VER)/projects/libcxx ) || \
(cd llvm-$(LLVM_VER)/projects/libcxx && \
git pull --ff-only)
llvm-$(LLVM_VER)/projects/libcxxabi: $(LLVM_LIBCXXABI_TAR)
([ ! -d llvm-$(LLVM_VER)/projects/libcxxabi ] && \
git clone $(LLVM_GIT_URL_LIBCXXABI) llvm-$(LLVM_VER)/projects/libcxxabi ) || \
(cd llvm-$(LLVM_VER)/projects/libcxxabi && \
git pull --ff-only)
libcxx-build:
mkdir -p libcxx-build
libcxx-build/Makefile: llvm-$(LLVM_VER)/projects/libcxx llvm-$(LLVM_VER)/projects/libcxxabi libcxx-build
cd libcxx-build && \
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix) -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="../llvm-$(LLVM_VER)/projects/libcxxabi/include" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(build_prefix) ../llvm-$(LLVM_VER)/projects/libcxx -DCMAKE_C_COMPILER="$(CC)" -DCMAKE_CXX_COMPILER="$(CXX)" -DCMAKE_SHARED_LINKER_FLAGS="-L$(build_libdir)"
$(build_libdir)/libc++abi.so: llvm-$(LLVM_VER)/projects/libcxxabi
cd llvm-$(LLVM_VER)/projects/libcxxabi/lib && \
OPTIONS=-I../../libcxx/include ./buildit
cp llvm-$(LLVM_VER)/projects/libcxxabi/lib/libc++abi.so.1.0 $(build_libdir)
ln -s $(build_libdir)/libc++abi.so.1.0 $(build_libdir)/libc++abi.so
ln -s $(build_libdir)/libc++abi.so.1.0 $(build_libdir)/libc++abi.so.1
install-libcxxabi: $(build_libdir)/libc++abi.so
libcxx-build/lib/libc++.so: install-libcxxabi
cd libcxx-build && $(MAKE)
$(build_libdir)/libc++.so: libcxx-build/lib/libc++.so
cd libcxx-build && $(MAKE) install
install-libcxx: $(build_libdir)/libc++.so
endif

ifeq ($(BUILD_CUSTOM_LIBCXX),1)
LIBCXX_DEPENDENCY = install-libcxx
endif

llvm-$(LLVM_VER)/configure: $(LLVM_TAR) $(LLVM_CLANG_TAR) $(LLVM_COMPILER_RT_TAR) $(LLVM_LIBCXX_TAR) $(LIBCXX_DEPENDENCY)
ifneq ($(LLVM_CLANG_TAR),)
$(JLCHECKSUM) $(LLVM_CLANG_TAR)
endif
ifneq ($(LLVM_COMPILER_RT_TAR),)
$(JLCHECKSUM) $(LLVM_COMPILER_RT_TAR)
endif

ifneq ($(LLVM_LIBCXX_TAR),)
$(JLCHECKSUM) $(LLVM_LIBCXX_TAR)
endif
Expand Down Expand Up @@ -345,19 +394,10 @@ ifeq ($(BUILD_LLVM_CLANG),1)
([ ! -d llvm-$(LLVM_VER)/tools/clang ] && \
git clone $(LLVM_GIT_URL_CLANG) llvm-$(LLVM_VER)/tools/clang ) || \
(cd llvm-$(LLVM_VER)/tools/clang && \
git pull --ff-only)
endif
endif
ifneq ($(LLVM_VER),svn)
ifneq ($(LLVM_COMPILER_RT_TAR),)
mkdir -p llvm-$(LLVM_VER)/projects/compiler-rt && \
$(TAR) -C llvm-$(LLVM_VER)/projects/compiler-rt --strip-components 1 -xf $(LLVM_COMPILER_RT_TAR)
git pull --ff-only)
endif
ifneq ($(LLVM_LIBCXX_TAR),)
mkdir -p llvm-$(LLVM_VER)/projects/libcxx && \
$(TAR) -C llvm-$(LLVM_VER)/projects/libcxx --strip-components 1 -xf $(LLVM_LIBCXX_TAR)
endif
else
ifeq ($(LLVM_VER),svn)
ifeq ($(BUILD_LLVM_CLANG),1)
([ ! -d llvm-$(LLVM_VER)/tools/clang ] && \
git clone $(LLVM_GIT_URL_CLANG) llvm-$(LLVM_VER)/tools/clang ) || \
Expand Down
4 changes: 2 additions & 2 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ CXXLD = $(LD) -dll -export:jl_setjmp -export:jl_longjmp
endif

$(build_shlibdir)/libjulia-debug.$(SHLIB_EXT): julia.expmap $(DOBJS) flisp/libflisp-debug.a support/libsupport-debug.a $(LIBUV)
@$(call PRINT_LINK, $(CXXLD) $(DEBUGFLAGS) $(DOBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(DEBUG_LIBS))
@$(call PRINT_LINK, $(CXXLD) $(CXXLDFLAGS) $(DEBUGFLAGS) $(DOBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(DEBUG_LIBS))
$(INSTALL_NAME_CMD)libjulia-debug.$(SHLIB_EXT) $@
$(DSYMUTIL) $@
libjulia-debug.a: julia.expmap $(DOBJS) flisp/libflisp-debug.a support/libsupport-debug.a
Expand All @@ -103,7 +103,7 @@ else
endif

$(build_shlibdir)/libjulia.$(SHLIB_EXT): julia.expmap $(OBJS) flisp/libflisp.a support/libsupport.a $(LIBUV)
@$(call PRINT_LINK, $(CXXLD) $(SHIPFLAGS) $(OBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(RELEASE_LIBS) $(SONAME))
@$(call PRINT_LINK, $(CXXLD) $(CXXLDFLAGS) $(SHIPFLAGS) $(OBJS) $(RPATH_ORIGIN) -o $@ $(LDFLAGS) $(RELEASE_LIBS) $(SONAME)) $(CXXLDFLAGS)

This comment has been minimized.

Copy link
@tkelman

tkelman Jun 1, 2016

Contributor

any reason this was added twice here?

$(INSTALL_NAME_CMD)libjulia.$(SHLIB_EXT) $@
$(DSYMUTIL) $@
libjulia.a: julia.expmap $(OBJS) flisp/libflisp.a support/libsupport.a
Expand Down
2 changes: 1 addition & 1 deletion src/flisp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ endif
endif

$(EXENAME): $(OBJS) $(LIBFILES) $(LIBTARGET).a flmain.o
@$(call PRINT_LINK, $(CCLD) $(SHIPFLAGS) $(OBJS) flmain.o $(LDFLAGS) -o $(EXENAME) $(LIBTARGET).a $(LIBS) $(OSLIBS))
@$(call PRINT_LINK, $(CCLD) $(SHIPFLAGS) $(OBJS) flmain.o -o $(EXENAME) $(LIBTARGET).a $(LIBS) $(OSLIBS))
ifneq ($(USEMSVC), 1)
$(call spawn,./$(EXENAME)) unittest.lsp
endif
Expand Down
4 changes: 2 additions & 2 deletions ui/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ CXXLD = $(LD)
endif

$(build_bindir)/julia$(EXE): repl.o
@$(call PRINT_LINK, $(CXXLD) $(LINK_FLAGS) $(SHIPFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia $(JLDFLAGS))
@$(call PRINT_LINK, $(CXXLD) $(CXXLDFLAGS) $(LINK_FLAGS) $(SHIPFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia $(JLDFLAGS))
$(build_bindir)/julia-debug$(EXE): repl.do
@$(call PRINT_LINK, $(CXXLD) $(LINK_FLAGS) $(DEBUGFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia-debug $(JLDFLAGS))
@$(call PRINT_LINK, $(CXXLD) $(CXXLDFLAGS) $(LINK_FLAGS) $(DEBUGFLAGS) $^ -o $@ -L$(build_private_libdir) -L$(build_libdir) -L$(build_shlibdir) -ljulia-debug $(JLDFLAGS))

clean: | $(CLEAN_TARGETS)
rm -f *.o *.do
Expand Down

0 comments on commit f38b485

Please sign in to comment.