build-cross-toolchain.sh (5800B)
1 #!/bin/bash 2 3 ################################################################################ 4 ### Defined Variables: 5 ### - CLFS : Root folder for CLFS build, holds final tarballs 6 ### - CLFS_BOOTSCRIPTS : Root folder for CLFS bootscripts 7 ### - CLFS_CONFIGS : Additional configuration files for CLFS packages 8 ### - CLFS_LOGS : Package build log root 9 ### - CLFS_SCRIPTS : Build script root 10 ### - CLFS_SOURCES : Package source root 11 ### ---------------------------------------------------------------------------- 12 ### - CLFS_ROOT : Root folder for cross-compiled system 13 ### - CLFS_BOOT_ROOT : Root folder for boot-required binaries 14 ### - CLFS_CROSS_NAME : Name of cross-toolchain root 15 ### - CLFS_CROSS_ROOT : Root folder for cross-toolchain 16 ### - CLFS_CROSS_SYSROOT : Sysroot for cross-toolchain 17 ################################################################################ 18 19 source ~/.bashrc 20 21 22 TIMESTAMP=$CLFS_CROSS_ROOT/successful-build 23 [ -f $TIMESTAMP ] && exit 0 24 25 26 COMMON_BINUTILS_OPTS=(\ 27 --enable-deterministic-archives \ 28 --disable-separate-code \ 29 ) 30 31 32 COMMON_GCC_OPTS=(\ 33 --enable-libstdcxx-time=rt \ 34 --disable-assembly \ 35 --disable-bootstrap \ 36 --disable-gnu-indirect-function \ 37 --disable-libmpx \ 38 --disable-libmudflap \ 39 --disable-libsanitizer \ 40 ) 41 42 43 LINUX () { 44 make mrproper 45 46 make ARCH=${CLFS_ARCH} headers_check 47 make ARCH=${CLFS_ARCH} headers 48 49 find usr/include -name '.*' -delete 50 rm usr/include/Makefile 51 cp -r usr/include ${CLFS_CROSS_SYSROOT} 52 } 53 EXTRACT "LINUX" LINUX "toolchain-linux-headers" 54 55 56 BINUTILS_PASS1 () { 57 mkdir -v binutils-build 58 cd binutils-build 59 60 ../configure \ 61 --prefix=${CLFS_CROSS_ROOT} \ 62 --with-sysroot=${CLFS_CROSS_SYSROOT} \ 63 --build=${CLFS_HOST} \ 64 --host=${CLFS_HOST} \ 65 --target=${CLFS_TARGET} \ 66 --disable-multilib \ 67 --disable-nls \ 68 --disable-shared \ 69 --disable-werror \ 70 ${COMMON_BINUTILS_OPTS[@]} 71 72 make && make install 73 } 74 EXTRACT "BINUTILS" BINUTILS_PASS1 "toolchain-binutils-pass1" 75 76 77 GCC_PASS1 () { 78 tar xf ../${MPFR_ARCHIVE} 79 mv -v ${MPFR_DIR} mpfr 80 tar xf ../${GMP_ARCHIVE} 81 mv -v ${GMP_DIR} gmp 82 tar xf ../${MPC_ARCHIVE} 83 mv -v ${MPC_DIR} mpc 84 85 mkdir -v gcc-build 86 cd gcc-build 87 88 ../configure \ 89 --prefix=${CLFS_CROSS_ROOT} \ 90 --with-sysroot=${CLFS_CROSS_SYSROOT} \ 91 --build=${CLFS_HOST} \ 92 --host=${CLFS_HOST} \ 93 --target=${CLFS_TARGET} \ 94 --with-arch=${CLFS_GCC_ARCH} \ 95 ${CLFS_GCC_OPTS} \ 96 --with-newlib \ 97 --without-headers \ 98 --enable-initfini-array \ 99 --enable-languages=c,c++ \ 100 --disable-decimal-float \ 101 --disable-libatomic \ 102 --disable-libgomp \ 103 --disable-libquadmath \ 104 --disable-libssp \ 105 --disable-libstdcxx \ 106 --disable-libvtv \ 107 --disable-multilib \ 108 --disable-nls \ 109 --disable-shared \ 110 --disable-threads \ 111 ${COMMON_GCC_OPTS[@]} 112 113 make all-gcc all-target-libgcc && make install-gcc install-target-libgcc 114 115 cd .. 116 cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ 117 `dirname $(${CLFS_TARGET}-gcc -print-libgcc-file-name)`/install-tools/include/limits.h 118 } 119 EXTRACT "GCC" GCC_PASS1 "toolchain-gcc-pass1" 120 121 122 MUSL () { 123 ./configure \ 124 CROSS_COMPILE=${CLFS_TARGET}- \ 125 --prefix=/ \ 126 --build=${CLFS_HOST} \ 127 --host=${CLFS_HOST} \ 128 --target=${CLFS_TARGET} 129 130 make && make DESTDIR=${CLFS_CROSS_SYSROOT} install 131 132 ln -fsv libc.so ${CLFS_CROSS_SYSROOT}/lib/ld-musl-*.so.1 133 134 ${CLFS_CROSS_ROOT}/libexec/gcc/${CLFS_TARGET}/${GCC_VER}/install-tools/mkheaders 135 } 136 EXTRACT "MUSL" MUSL "toolchain-musl-libc" 137 138 139 LIBSTDCXX_PASS1 () { 140 mkdir -v libstdcxx-build 141 cd libstdcxx-build 142 143 ../libstdc++-v3/configure \ 144 --prefix=/ \ 145 --build=${CLFS_HOST} \ 146 --host=${CLFS_HOST} \ 147 --target=${CLFS_TARGET} \ 148 --with-gxx-include-dir=${CLFS_CROSS_SYSROOT}/include/c++/${GCC_VER} \ 149 --disable-libstdcxx-pch \ 150 --disable-multilib \ 151 --disable-nls 152 153 make && make DESTDIR=${CLFS_CROSS_SYSROOT} install 154 } 155 EXTRACT "GCC" LIBSTDCXX_PASS1 "toolchain-libstdc++-pass1" 156 157 158 BINUTILS_PASS2 () { 159 mkdir -v binutils-build 160 cd binutils-build 161 162 ../configure \ 163 --prefix=${CLFS_CROSS_ROOT} \ 164 --with-sysroot=${CLFS_ROOT} \ 165 --with-build-sysroot=${CLFS_CROSS_SYSROOT} \ 166 --build=${CLFS_HOST} \ 167 --host=${CLFS_HOST} \ 168 --target=${CLFS_TARGET} \ 169 --enable-shared \ 170 --disable-multilib \ 171 --disable-nls \ 172 --disable-werror \ 173 ${COMMON_BINUTILS_OPTS[@]} 174 175 make && make install 176 } 177 EXTRACT "BINUTILS" BINUTILS_PASS2 "toolchain-binutils-pass2" 178 179 180 GCC_PASS2 () { 181 tar xf ../${MPFR_ARCHIVE} 182 mv -v ${MPFR_DIR} mpfr 183 tar xf ../${GMP_ARCHIVE} 184 mv -v ${GMP_DIR} gmp 185 tar xf ../${MPC_ARCHIVE} 186 mv -v ${MPC_DIR} mpc 187 188 mkdir -v gcc-build 189 cd gcc-build 190 191 mkdir -pv ${CLFS_TARGET}/libgcc 192 ln -s ../../../libgcc/gthr-posix.h ${CLFS_TARGET}/libgcc/gthr-default.h 193 194 ../configure \ 195 --prefix=${CLFS_CROSS_ROOT} \ 196 --with-sysroot=${CLFS_ROOT} \ 197 --with-build-sysroot=${CLFS_CROSS_SYSROOT} \ 198 --build=${CLFS_HOST} \ 199 --host=${CLFS_HOST} \ 200 --target=${CLFS_TARGET} \ 201 CC_FOR_TARGET=${CLFS_TARGET}-gcc \ 202 --with-arch=${CLFS_GCC_ARCH} \ 203 ${CLFS_GCC_OPTS} \ 204 --enable-initfini-array \ 205 --enable-languages=c,c++ \ 206 --enable-shared \ 207 --enable-tls \ 208 --disable-multilib \ 209 --disable-nls \ 210 ${COMMON_GCC_OPTS[@]} 211 212 make && make install 213 } 214 EXTRACT "GCC" GCC_PASS2 "toolchain-gcc-pass2" 215 216 217 ## Setting toolchain variables 218 echo export CC=\""${CLFS_TARGET}-gcc --sysroot=${CLFS_ROOT}\"" >> ~/.bashrc 219 echo export CXX=\""${CLFS_TARGET}-g++ --sysroot=${CLFS_ROOT}\"" >> ~/.bashrc 220 echo export AR=\""${CLFS_TARGET}-ar\"" >> ~/.bashrc 221 echo export AS=\""${CLFS_TARGET}-as\"" >> ~/.bashrc 222 echo export LD=\""${CLFS_TARGET}-ld --sysroot=${CLFS_ROOT}\"" >> ~/.bashrc 223 echo export RANLIB=\""${CLFS_TARGET}-ranlib\"" >> ~/.bashrc 224 echo export READELF=\""${CLFS_TARGET}-readelf\"" >> ~/.bashrc 225 echo export STRIP=\""${CLFS_TARGET}-strip\"" >> ~/.bashrc 226 227 228 touch $TIMESTAMP