@@ -14,6 +14,32 @@ QEMU_SRCDIR := @with_qemu_src@
1414SPIKE_SRCDIR := @with_spike_src@
1515PK_SRCDIR := @with_pk_src@
1616LLVM_SRCDIR := @with_llvm_src@
17+ LLVM_LINUX_COMMON_CMAKE_FLAGS = \
18+ -DCMAKE_INSTALL_PREFIX=$(INSTALL_DIR ) \
19+ -DCMAKE_BUILD_TYPE=Release \
20+ -DLLVM_TARGETS_TO_BUILD="RISCV" \
21+ -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" \
22+ -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" \
23+ -DDEFAULT_SYSROOT="../sysroot" \
24+ -DLLVM_INSTALL_TOOLCHAIN_ONLY=On \
25+ -DLLVM_BINUTILS_INCDIR=$(BINUTILS_SRCDIR ) /include \
26+ -DLLVM_PARALLEL_LINK_JOBS=4
27+ define LLVM_LINUX_SYSROOT_SETUP
28+ # We have the following situation:
29+ # - sysroot directory: $(INSTALL_DIR)/sysroot
30+ # - GCC install directory: $(INSTALL_DIR)
31+ # However, LLVM does not allow to set a GCC install prefix
32+ # (-DGCC_INSTALL_PREFIX) if a sysroot (-DDEFAULT_SYSROOT) is set
33+ # (the GCC install prefix will be ignored silently).
34+ # Without a proper sysroot path feature.h won't be found by clang.
35+ # Without a proper GCC install directory libgcc won't be found.
36+ # As a workaround we have to merge both paths:
37+ mkdir -p $(SYSROOT ) /lib/
38+ ln -s -f ../../lib/gcc $(SYSROOT ) /lib/gcc
39+ rm -rf $@ $(notdir $@ )
40+ mkdir $(notdir $@ )
41+ cd $(notdir $@ ) && ln -f -s $(SYSROOT ) sysroot
42+ endef
1743DEJAGNU_SRCDIR := @with_dejagnu_src@
1844DEBUG_INFO := @debug_info@
1945ENABLE_DEFAULT_PIE := @enable_default_pie@
@@ -159,6 +185,7 @@ ifeq (@enable_llvm@,--enable-llvm)
159185all : stamps/build-llvm-@default_target@
160186newlib : stamps/build-llvm-newlib
161187linux : stamps/build-llvm-linux
188+ musl : stamps/build-llvm-musl
162189ifeq (@multilib_flags@,--enable-multilib)
163190$(error "Setting multilib flags for LLVM builds is not supported.")
164191endif
@@ -1145,33 +1172,12 @@ stamps/build-qemu: $(QEMU_SRCDIR) $(QEMU_SRC_GIT) $(PREPARATION_STAMP)
11451172
11461173stamps/build-llvm-linux : $(LLVM_SRCDIR ) $(LLVM_SRC_GIT ) $(BINUTILS_SRCDIR ) $(BINUTILS_SRC_GIT ) \
11471174 stamps/build-gcc-linux-stage2
1148- # We have the following situation:
1149- # - sysroot directory: $(INSTALL_DIR)/sysroot
1150- # - GCC install directory: $(INSTALL_DIR)
1151- # However, LLVM does not allow to set a GCC install prefix
1152- # (-DGCC_INSTALL_PREFIX) if a sysroot (-DDEFAULT_SYSROOT) is set
1153- # (the GCC install prefix will be ignored silently).
1154- # Without a proper sysroot path feature.h won't be found by clang.
1155- # Without a proper GCC install directory libgcc won't be found.
1156- # As a workaround we have to merge both paths:
1157- mkdir -p $(SYSROOT)/lib/
1158- ln -s -f $(INSTALL_DIR)/lib/gcc $(SYSROOT)/lib/gcc
1159- rm -rf $@ $(notdir $@)
1160- mkdir $(notdir $@)
1161- cd $(notdir $@) && ln -f -s $(SYSROOT) sysroot
1175+ $(LLVM_LINUX_SYSROOT_SETUP)
11621176 cd $(notdir $@) && \
11631177 cmake $(LLVM_SRCDIR)/llvm \
1164- -DCMAKE_INSTALL_PREFIX=$(INSTALL_DIR) \
1165- -DCMAKE_BUILD_TYPE=Release \
1166- -DLLVM_TARGETS_TO_BUILD="RISCV" \
1167- -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" \
1168- -DLLVM_ENABLE_RUNTIMES="compiler-rt;libcxx;libcxxabi;libunwind" \
1169- -DLLVM_DEFAULT_TARGET_TRIPLE="$(LINUX_TUPLE)" \
1170- -DDEFAULT_SYSROOT="../sysroot" \
1171- -DLLVM_RUNTIME_TARGETS=$(call make_tuple,$(XLEN),linux-gnu) \
1172- -DLLVM_INSTALL_TOOLCHAIN_ONLY=On \
1173- -DLLVM_BINUTILS_INCDIR=$(BINUTILS_SRCDIR)/include \
1174- -DLLVM_PARALLEL_LINK_JOBS=4 \
1178+ $(LLVM_LINUX_COMMON_CMAKE_FLAGS) \
1179+ -DLLVM_DEFAULT_TARGET_TRIPLE=$(LINUX_TUPLE) \
1180+ -DLLVM_RUNTIME_TARGETS=$(LINUX_TUPLE) \
11751181 $(LLVM_EXTRA_CONFIGURE_FLAGS)
11761182 $(MAKE) -C $(notdir $@)
11771183 $(MAKE) -C $(notdir $@) $(subst -,/,$(INSTALL_TARGET))
@@ -1216,11 +1222,28 @@ stamps/build-llvm-linux: $(LLVM_SRCDIR) $(LLVM_SRC_GIT) $(BINUTILS_SRCDIR) $(BIN
12161222 $(MAKE) -C $(notdir $@)/openmp-static; \
12171223 $(MAKE) -C $(notdir $@)/openmp-static install; \
12181224 fi
1219- cp $(notdir $@)/lib/riscv$(XLEN)-unknown-linux-gnu /libc++* $(SYSROOT)/lib
1220- cp $(notdir $@)/lib/riscv$(XLEN)-unknown-linux-gnu /libunwind* $(SYSROOT)/lib
1225+ cp $(notdir $@)/lib/$(LINUX_TUPLE) /libc++* $(SYSROOT)/lib
1226+ cp $(notdir $@)/lib/$(LINUX_TUPLE) /libunwind* $(SYSROOT)/lib
12211227 cd $(INSTALL_DIR)/bin && ln -s -f clang $(LINUX_TUPLE)-clang && ln -s -f clang++ $(LINUX_TUPLE)-clang++
12221228 mkdir -p $(dir $@) && touch $@
12231229
1230+ stamps/build-llvm-musl : $(LLVM_SRCDIR ) $(LLVM_SRC_GIT ) $(BINUTILS_SRCDIR ) $(BINUTILS_SRC_GIT ) \
1231+ stamps/build-gcc-musl-stage2
1232+ $(LLVM_LINUX_SYSROOT_SETUP)
1233+ cd $(notdir $@) && \
1234+ cmake $(LLVM_SRCDIR)/llvm \
1235+ $(LLVM_LINUX_COMMON_CMAKE_FLAGS) \
1236+ -DLLVM_DEFAULT_TARGET_TRIPLE=$(MUSL_TUPLE) \
1237+ -DLLVM_RUNTIME_TARGETS=$(MUSL_TUPLE) \
1238+ -DRUNTIMES_$(MUSL_TUPLE)_LIBCXX_HAS_MUSL_LIBC=On \
1239+ $(LLVM_EXTRA_CONFIGURE_FLAGS)
1240+ $(MAKE) -C $(notdir $@)
1241+ $(MAKE) -C $(notdir $@) $(subst -,/,$(INSTALL_TARGET))
1242+ cp $(notdir $@)/lib/$(MUSL_TUPLE)/libc++* $(SYSROOT)/lib
1243+ cp $(notdir $@)/lib/$(MUSL_TUPLE)/libunwind* $(SYSROOT)/lib
1244+ cd $(INSTALL_DIR)/bin && ln -s -f clang $(MUSL_TUPLE)-clang && ln -s -f clang++ $(MUSL_TUPLE)-clang++
1245+ mkdir -p $(dir $@) && touch $@
1246+
12241247stamps/build-llvm-newlib : $(LLVM_SRCDIR ) $(LLVM_SRC_GIT ) $(BINUTILS_SRCDIR ) $(BINUTILS_SRC_GIT ) \
12251248 stamps/build-gcc-newlib-stage2
12261249 rm -rf $@ $(notdir $@)
0 commit comments