-
Notifications
You must be signed in to change notification settings - Fork 18
/
06-clang-llvm
140 lines (122 loc) · 6.54 KB
/
06-clang-llvm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# llvmtools: LLVM+clang
# Build and install as cmlfs
cd ${LLVMSRC}
# make sure compiler-rt are unpacked in ${{LLVMSRC}/projects
# and clang & lld in ${LLVMSRC}/tools. No need to unpack libunwind,
# libcxxabi and libcxxabi as all 3 are installed in /llvmtools
rm -rf projects/{libunwind,libcxx,libcxxabi}
tar xf ../pkgs/compiler-rt-12.0.0.src.tar.xz
mv compiler-rt-12.0.0.src projects/compiler-rt
tar xf ../pkgs/clang-12.0.0.src.tar.xz
tar xf ../pkgs/lld-12.0.0.src.tar.xz
mv clang-12.0.0.src tools/clang
mv lld-12.0.0.src tools/lld
# Apply patches from void linux
cd ${LLVMSRC}/projects/compiler-rt
patch -Np1 -i ../../../patches/llvm12-compiler-rt-void/compiler-rt-aarch64-ucontext.patch
patch -Np1 -i ../../../patches/llvm12-compiler-rt-void/compiler-rt-sanitizer-ppc64-musl.patch
patch -Np1 -i ../../../patches/llvm12-compiler-rt-void/compiler-rt-size_t.patch
patch -Np1 -i ../../../patches/llvm12-compiler-rt-void/compiler-rt-xray-ppc64-musl.patch
cd ${LLVMSRC}/tools/clang
patch -Np1 -i ../../../patches/llvm12-clang-void/clang-001-fix-unwind-chain-inclusion.patch
patch -Np1 -i ../../../patches/llvm12-clang-void/clang-002-add-musl-triples.patch
patch -Np1 -i ../../../patches/llvm12-clang-void/clang-003-ppc64-dynamic-linker-path.patch
patch -Np1 -i ../../../patches/llvm12-clang-void/clang-004-ppc64-musl-elfv2.patch
cd ${LLVMSRC}
patch -Np1 -i ../patches/llvm12-void/llvm-001-musl.patch
patch -Np1 -i ../patches/llvm12-void/llvm-002-musl-ppc64-elfv2.patch
patch -Np1 -i ../patches/llvm12-void/llvm-003-ppc-secureplt.patch
patch -Np1 -i ../patches/llvm12-void/llvm-004-override-opt.patch
patch -Np1 -i ../patches/llvm12-void/llvm-005-ppc-bigpic.patch
patch -Np1 -i ../patches/llvm12-void/llvm-006-aarch64-mf_exec.patch
# Disable sanitizers for musl systems, per Void Linux... fixes early build failure
sed -i 's/set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE)/set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE)/' projects/compiler-rt/cmake/config-ix.cmake
# Fix missing header for lld, https://bugs.llvm.org/show_bug.cgi?id=49228
tar xf ../pkgs/libunwind-12.0.0.src.tar.xz libunwind-12.0.0.src/include/mach-o/compact_unwind_encoding.h
mv libunwind-12.0.0.src/include/mach-o tools/lld/include/
rm -rf libunwind-12.0.0.src/
# Set flags to greatly reduce debugging symbols
export CFLAGS=" -g -g1"
export CXXFLAGS=" -g -g1"
# Update host/target triple detection
cp -v ../files/config.guess-musl cmake/config.guess
# Remember to use the configured stage0 clang
CC=x86_64-cmlfs-linux-musl-clang
CXX=x86_64-cmlfs-linux-musl-clang++
# Configure
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="/llvmtools" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_ENABLE_LIBEDIT=OFF \
-DLLVM_ENABLE_LIBXML2=OFF \
-DLLVM_ENABLE_LIBCXX=ON \
-DLLVM_INCLUDE_GO_TESTS=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_DOCS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-pc-linux-musl" \
-DLLVM_HOST_TRIPLE="x86_64-pc-linux-musl" \
-DLLVM_TARGET_ARCH="X86" \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DCOMPILER_RT_DEFAULT_TARGET_TRIPLE="x86_64-pc-linux-musl" \
-DCOMPILER_RT_BUILD_SANITIZERS=OFF \
-DCOMPILER_RT_BUILD_XRAY=OFF \
-DCOMPILER_RT_BUILD_PROFILE=OFF \
-DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
-DCOMPILER_RT_USE_BUILTINS_LIBRARY=ON \
-DCLANG_DEFAULT_CXX_STDLIB=libc++ \
-DCLANG_DEFAULT_UNWINDLIB=libunwind \
-DCLANG_DEFAULT_RTLIB=compiler-rt \
-DCLANG_DEFAULT_LINKER="/llvmtools/bin/ld.lld" \
-DDEFAULT_SYSROOT="/llvmtools" \
-DLLVM_ENABLE_LLD=ON \
-DLLVM_ENABLE_RTTI=ON \
-DLLVM_ENABLE_ZLIB=OFF \
-DBacktrace_INCLUDE_DIR="/llvmtools/include" \
-DBacktrace_LIBRARY="/llvmtools/lib/libexecinfo.so" \
-DCMAKE_CXX_COMPILER_AR="/cgnutools/bin/llvm-ar" \
-DCMAKE_C_COMPILER_AR="/cgnutools/bin/llvm-ar" \
-DCMAKE_CXX_COMPILER_RANLIB="/cgnutools/bin/llvm-ranlib" \
-DCMAKE_C_COMPILER_RANLIB="/cgnutools/bin/llvm-ranlib" \
-DCMAKE_INSTALL_OLDINCLUDEDIR="/llvmtools/include" \
-DCMAKE_LINKER="/cgnutools/bin/ld.lld" \
-DCMAKE_NM="/cgnutools/bin/llvm-nm" \
-DCMAKE_OBJCOPY="/cgnutools/bin/llvm-objcopy" \
-DCMAKE_READELF="/cgnutools/bin/llvm-readelf" \
-DCMAKE_STRIP="/cgnutools/bin/llvm-strip" \
-DICONV_LIBRARY_PATH="/llvmtools/lib/libc.so"
# Compile
make -C build
# Install
cd build && \
cmake -DCMAKE_INSTALL_PREFIX="/llvmtools" -P cmake_install.cmake
# Some binaries were not installed
cp -v build/bin/llvm-as /llvmtools/bin/
cp -v build/bin/llvm-readobj /llvmtools/bin/
ln -sv llvm-readobj /llvmtools/bin/llvm-readelf
# Since binutils will not be used, create the symlinks to the
# llvm counterparts
for t in as ar ranlib readelf nm objcopy objdump size strip
do
ln -sv llvm-$t /llvmtools/bin/$t
done
# Make lld as default linker
ln -sv lld /llvmtools/bin/ld
rm -rf build
# Configure stage1 clang to build binaries with /llvmtools/lib/ld-musl-x86_64.so.1 instead
# of /lib/ld-musl-x86_64.so.1. This is similar in Musl-LFS/LFS when gcc specs
# file is modified to use the dynamic linker in /tools instead of host's /lib
ln -sv clang-12 /llvmtools/bin/x86_64-pc-linux-musl-clang
ln -sv clang-12 /llvmtools/bin/x86_64-pc-linux-musl-clang++
cat > /llvmtools/bin/x86_64-pc-linux-musl.cfg << "EOF"
-Wl,-dynamic-linker /llvmtools/lib/ld-musl-x86_64.so.1
EOF
# Unset these flags
unset CFLAGS CXXFLAGS
# Cross-tools and cgnutools no longer needed:
#export PATH=/llvmtools/bin:/usr/bin:/bin