#!/bin/bash set -e TARGET=arm-uclinuxfdpiceabi TOP="$(pwd)" BUILD_DIR="${TOP}/build" BUILD_SRC_DIR="${BUILD_DIR}/src" INSTALL_DIR="${TOP}/install" INSTALL_BIN_DIR="${INSTALL_DIR}/bin" KERNEL_SYSROOT_DIR="${INSTALL_DIR}/sysroot" KERNEL_HEADERS_DIR="${KERNEL_SYSROOT_DIR}/usr/include" CFLAGS_TOOLSET='-O2' CFLAGS_TARGET='-Os -mthumb' CFLAGS=$CFLAGS_TOOLSET CFLAGS_FOR_TARGET=$CFLAGS_TARGET CXXFLAGS_FOR_TARGET=$CFLAGS_TARGET SUBARCH=armv7-m SUBMODE=thumb echo "== Создание директорий ==" mkdir -p ${KERNEL_SYSROOT_DIR} mkdir -p ${BUILD_SRC_DIR} ####################################### # РАСПАКОВКА В build/src ####################################### echo "== Распаковка архивов в build/src ==" for f in *.tar.xz; do echo " * $f" tar -xf "$f" -C ${BUILD_SRC_DIR} done # Пути на исходники SRC_BINUTILS="${BUILD_SRC_DIR}/binutils-2.34" SRC_GCC="${BUILD_SRC_DIR}/gcc-13.4.0" SRC_LINUX="${BUILD_SRC_DIR}/linux-4.9.224" SRC_UCLIBC="${BUILD_SRC_DIR}/uClibc-ng-1.0.34" ####################################### # BINUTILS ####################################### echo "== Сборка binutils ==" mkdir -p build/binutils cd build/binutils $SRC_BINUTILS/configure \ --target=${TARGET} \ --prefix=${INSTALL_DIR} \ --with-sysroot=${KERNEL_SYSROOT_DIR} \ --disable-nls \ --without-bugurl \ --disable-werror make -j12 make install cd ../.. ####################################### # GCC STAGE 1 ####################################### echo "== Сборка GCC Stage 1 ==" cd $SRC_GCC ./contrib/download_prerequisites cd ../../.. mkdir -p build/gcc1 cd build/gcc1 $SRC_GCC/configure \ --target=${TARGET} \ --prefix=${TOP}/install \ --with-arch=${SUBARCH} \ --with-mode=${SUBMODE} \ --without-headers \ --with-newlib \ --disable-shared \ --disable-threads \ --disable-libssp \ --disable-libgomp \ --disable-libmudflap \ --enable-languages=c \ --disable-libquadmath \ --disable-multilib \ --without-cloog \ --without-ppl \ --disable-nls \ --disable-libatomic make -j12 make install cd ../.. ####################################### # LINUX HEADERS ####################################### echo "== Установка заголовков linux ==" mkdir -p build/kernelheader cd $SRC_LINUX PATH=${INSTALL_BIN_DIR}:${PATH} \ make headers_install ARCH=arm \ INSTALL_HDR_PATH=${TOP}/install/sysroot/usr \ CROSS_COMPILE=${TARGET}- \ O=${TOP}/build/kernelheader cd ../../.. ####################################### # UCLIBC ####################################### echo "== Сборка uClibc ==" cd $SRC_UCLIBC # Удаляем старое значение sed -i '/^KERNEL_HEADERS=/d' .config # Добавляем новое echo "KERNEL_HEADERS=\"${KERNEL_HEADERS_DIR}\"" >> .config PATH=${TOP}/install/bin:${PATH} make all -j12 PATH=${TOP}/install/bin:${PATH} make PREFIX=${TOP}/install/sysroot install cd ../../.. ####################################### # GCC FINAL ####################################### echo "== Сборка финального GCC ==" mkdir -p build/gcc2 cd build/gcc2 $SRC_GCC/configure \ --target=${TARGET} \ --prefix=${INSTALL_DIR} \ --with-sysroot=${KERNEL_SYSROOT_DIR} \ --with-arch=${SUBARCH} \ --with-mode=${SUBMODE} \ --enable-languages=c,c++ \ --enable-threads=posix \ --enable-fdpic \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp \ --disable-libatomic make -j12 make install cd ../.. ####################################### # STRIP ####################################### echo "== Strip toolchain ==" WDIR=$(mktemp -d) trap "rm -Rf $WDIR" EXIT tar -C install --atime-preserve -cf - . | tar --atime-preserve -xf - -C $WDIR find $WDIR -type f -exec strip -p {} \; > /dev/null 2>&1 find $WDIR -exec install/bin/${TARGET}-strip -p {} \; > /dev/null 2>&1 tar -C $WDIR --atime-preserve -czf toolset-jlv-${SUBARCH}.tgz . echo "== Готово ==" ####################################### # УПРАВЛЕНИЕ АРХИВАМИ ####################################### echo "" echo "=== Управление архивами ===" echo "Собрана тулчейн: toolset-jlv-${SUBARCH}.tgz" read -p "Удалить исходные архивы (*.tar.xz)? (y/N): " -n 1 -r echo [[ $REPLY =~ ^[Yy]$ ]] && rm -f *.tar.xz && echo "Архивы удалены." echo "" echo "=== Очистка временных файлов ===" read -p "Удалить директории сборки (build/src и build/*)? (y/N): " -n 1 -r echo [[ $REPLY =~ ^[Yy]$ ]] && rm -rf build && echo "Временные файлы удалены." echo "" echo "== Сборка завершена полностью =="