Skip to content

Commit c7b3494

Browse files
authored
Merge pull request #1718 from zqb-all/musl-llvm
musl: support build-llvm-musl
2 parents 98c8ec4 + dec5b17 commit c7b3494

File tree

1 file changed

+50
-27
lines changed

1 file changed

+50
-27
lines changed

Makefile.in

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,32 @@ QEMU_SRCDIR := @with_qemu_src@
1414
SPIKE_SRCDIR := @with_spike_src@
1515
PK_SRCDIR := @with_pk_src@
1616
LLVM_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
1743
DEJAGNU_SRCDIR := @with_dejagnu_src@
1844
DEBUG_INFO := @debug_info@
1945
ENABLE_DEFAULT_PIE := @enable_default_pie@
@@ -159,6 +185,7 @@ ifeq (@enable_llvm@,--enable-llvm)
159185
all: stamps/build-llvm-@default_target@
160186
newlib: stamps/build-llvm-newlib
161187
linux: stamps/build-llvm-linux
188+
musl: stamps/build-llvm-musl
162189
ifeq (@multilib_flags@,--enable-multilib)
163190
$(error "Setting multilib flags for LLVM builds is not supported.")
164191
endif
@@ -1145,33 +1172,12 @@ stamps/build-qemu: $(QEMU_SRCDIR) $(QEMU_SRC_GIT) $(PREPARATION_STAMP)
11451172

11461173
stamps/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+
12241247
stamps/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

Comments
 (0)