stage2.sh (4998B)
1 #!/bin/sh 2 3 . "$(dirname $0)/clfs-env.sh" 4 5 echo "Building $TARGET sysroot..." 6 7 # cross-compilation wrappers 8 cat > $CROSSTOOLS/bin/$TARGET-cc <<EOF 9 #!/bin/sh 10 exec $CROSSTOOLS/bin/clang \ 11 --target=$TARGET \ 12 --sysroot=$SYSROOT \ 13 -resource-dir=$SYSROOT/usr/lib/clang/$LLVM_VER_MAJOR \ 14 \$@ 15 EOF 16 17 cat > $CROSSTOOLS/bin/$TARGET-c++ <<EOF 18 #!/bin/sh 19 exec $CROSSTOOLS/bin/clang++ \ 20 --target=$TARGET \ 21 --sysroot=$SYSROOT \ 22 -resource-dir=$SYSROOT/usr/lib/clang/$LLVM_VER_MAJOR \ 23 \$@ 24 EOF 25 26 cat > $CROSSTOOLS/bin/$TARGET-ld <<EOF 27 #!/bin/sh 28 exec $CROSSTOOLS/bin/ld.lld \ 29 --sysroot=$SYSROOT \ 30 \$@ 31 EOF 32 33 chmod +x $CROSSTOOLS/bin/$TARGET-{cc,c++,ld} 34 35 cat > $CROSSTOOLS/$TARGET-cmake-toolchain.cmake <<EOF 36 set(CMAKE_SYSTEM_NAME $CMAKE_SYSTEM_NAME) 37 set(CMAKE_SYSTEM_PROCESSOR $CMAKE_SYSTEM_PROCESSOR) 38 39 set(CMAKE_SYSROOT $SYSROOT) 40 set(CMAKE_STAGING_PREFIX $SYSROOT) 41 42 set(CMAKE_C_COMPILER $CROSSTOOLS/bin/$TARGET-cc) 43 set(CMAKE_C_COMPILER_TARGET $TARGET) 44 set(CMAKE_CXX_COMPILER $CROSSTOOLS/bin/$TARGET-c++) 45 set(CMAKE_CXX_COMPILER_TARGET $TARGET) 46 47 set(CMAKE_AR $CROSSTOOLS/bin/llvm-ar) 48 set(CMAKE_RANLIB $CROSSTOOLS/bin/llvm-ranlib) 49 50 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 51 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 52 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 53 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 54 EOF 55 56 cat > $CROSSTOOLS/$TARGET-meson-toolchain.txt <<EOF 57 [binaries] 58 c = '$CROSSTOOLS/bin/$TARGET-cc' 59 cpp = '$CROSSTOOLS/bin/$TARGET-c++' 60 ld = '$CROSSTOOLS/bin/$TARGET-ld' 61 ar = '$CROSSTOOLS/bin/llvm-ar' 62 objcopy = '$CROSSTOOLS/bin/llvm-objcopy' 63 strip = '$CROSSTOOLS/bin/llvm-strip' 64 65 [properties] 66 sys_root = '$SYSROOT' 67 68 [host_machine] 69 system = '$MESON_SYSTEM' 70 cpu_family = '$MESON_CPU_FAMILY' 71 cpu = '$MESON_CPU' 72 endian = '$MESON_ENDIAN' 73 EOF 74 75 # create FHS-compliant sysroot directories 76 mkdir -v \ 77 $SYSROOT/bin \ 78 $SYSROOT/dev \ 79 $SYSROOT/etc \ 80 $SYSROOT/lib \ 81 $SYSROOT/mnt \ 82 $SYSROOT/opt \ 83 $SYSROOT/proc \ 84 $SYSROOT/root \ 85 $SYSROOT/run \ 86 $SYSROOT/sbin \ 87 $SYSROOT/srv \ 88 $SYSROOT/sys \ 89 $SYSROOT/tmp \ 90 $SYSROOT/usr \ 91 $SYSROOT/var 92 93 mkdir -v \ 94 $SYSROOT/etc/opt 95 96 mkdir -v \ 97 $SYSROOT/usr/bin \ 98 $SYSROOT/usr/include \ 99 $SYSROOT/usr/lib \ 100 $SYSROOT/usr/local \ 101 $SYSROOT/usr/sbin \ 102 $SYSROOT/usr/share \ 103 $SYSROOT/usr/src 104 105 mkdir -v \ 106 $SYSROOT/usr/local/bin \ 107 $SYSROOT/usr/local/etc \ 108 $SYSROOT/usr/local/games \ 109 $SYSROOT/usr/local/include \ 110 $SYSROOT/usr/local/lib \ 111 $SYSROOT/usr/local/man \ 112 $SYSROOT/usr/local/sbin \ 113 $SYSROOT/usr/local/share \ 114 $SYSROOT/usr/local/src 115 116 mkdir -v \ 117 $SYSROOT/var/cache \ 118 $SYSROOT/var/lib \ 119 $SYSROOT/var/local \ 120 $SYSROOT/var/lock \ 121 $SYSROOT/var/log \ 122 $SYSROOT/var/opt \ 123 $SYSROOT/var/run \ 124 $SYSROOT/var/spool \ 125 $SYSROOT/var/tmp 126 127 # build linux-headers (requires HOSTCC) 128 echo "Building linux-headers..." 129 cp -r $SOURCES/$LINUX_DIR $WORK/$LINUX_DIR 130 cd $WORK/$LINUX_DIR 131 132 make HOSTCC=$HOSTCC $LINUX_HOSTCC_OPTS mrproper 133 make HOSTCC=$HOSTCC $LINUX_HOSTCC_OPTS ARCH=$LINUX_ARCH \ 134 INSTALL_HDR_PATH=$SYSROOT/usr headers_install 135 136 # build musl-libc headers 137 echo "Building musl-libc-headers..." 138 mkdir -p $WORK/build-libc-headers 139 cd $WORK/build-libc-headers 140 141 $SOURCES/$MUSL_DIR/configure \ 142 CROSS_COMPILER=$TARGET- \ 143 --target=$TARGET \ 144 --prefix=/usr \ 145 --syslibdir=/ 146 147 make DESTDIR=$SYSROOT install-headers 148 149 # build compiler-rt builtins 150 echo "Building compiler-rt builtins..." 151 mkdir -p $WORK/build-builtins 152 cmake -S $SOURCES/$LLVM_DIR/compiler-rt/lib/builtins -B $WORK/build-builtins -GNinja \ 153 -DCMAKE_INSTALL_PREFIX=$SYSROOT/usr/lib/clang/$LLVM_VER_MAJOR \ 154 -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=$TARGET 155 156 cmake --build $WORK/build-builtins 157 cmake --install $WORK/build-builtins 158 159 # build musl-libc 160 echo "Building musl-libc..." 161 mkdir -p $WORK/build-libc 162 cd $WORK/build-libc 163 164 $SOURCES/$MUSL_DIR/configure \ 165 CROSS_COMPILER=$TARGET- \ 166 --target=$TARGET \ 167 --prefix=/usr \ 168 ---syslibdir=/ 169 170 make DESTDIR=$SYSROOT install -j$(nproc) 171 172 cd $WORK 173 174 # build libunwind, libcxx, libccxabi 175 echo "Building libunwind, libcxx, and libcxxabi..." 176 177 LLVM_LIBUNWIND_FLAGS=" 178 -DLIBUNWIND_USE_COMPILER_RT=ON 179 " 180 181 LLVM_LIBCXXABI_FLAGS=" 182 -DLIBCXXABI_INCLUDE_TESTS=OFF 183 -DLIBCXXABI_USE_COMPILER_RT=ON 184 -DLIBCXXABI_USE_LLVM_UNWINDER=ON 185 " 186 187 LLVM_LIBCXX_FLAGS=" 188 -DLIBCXX_INCLUDE_BENCHMARKS=OFF 189 -DLIBCXX_INCLUDE_DOCS=OFF 190 -DLIBCXX_CXX_ABI=libcxxabi 191 -DLIBCXX_USE_COMPILER_RT=ON 192 -DLIBCXX_HAS_MUSL_LIBC=ON 193 " 194 195 # TODO: because our c/cxx compilers do not yet have libunwind or libc++, we 196 # must use -DCMAKE_{C,CXX}_COMPILER_WORKS=ON to pretend we have a working 197 # toolchain. -DCMAKE_TRY_COMPILE_TARGET=STATIC_LIBRARY doesn't work, as it 198 # leaks information from our host sysroot (__cxa_thread_atexit_impl for libc++) 199 cmake -S $SOURCES/$LLVM_DIR/runtimes -B $WORK/build-cxxrt -GNinja \ 200 -DCMAKE_INSTALL_PREFIX=$SYSROOT/usr \ 201 -DCMAKE_C_COMPILER_WORKS=ON \ 202 -DCMAKE_CXX_COMPILER_WORKS=ON \ 203 -DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \ 204 $LLVM_LIBUNWIND_FLAGS \ 205 $LLVM_LIBCXXABI_FLAGS \ 206 $LLVM_LIBCXX_FLAGS 207 208 cmake --build $WORK/build-cxxrt 209 cmake --install $WORK/build-cxxrt 210 211 echo "Built $TARGET sysroot!"