From 446b697ba658779f4824c38233778b3108ca8b8f Mon Sep 17 00:00:00 2001 From: Egor Tsyganchuk Date: Thu, 4 Dec 2025 15:57:34 +0300 Subject: [PATCH] Script has been supplemented --- build-toolchain.sh | 231 ++++++++++++++++++++++----------------------- 1 file changed, 112 insertions(+), 119 deletions(-) diff --git a/build-toolchain.sh b/build-toolchain.sh index a3ee7ad..8d95077 100755 --- a/build-toolchain.sh +++ b/build-toolchain.sh @@ -1,12 +1,24 @@ #!/bin/bash set -e -TARGET=arm-uclinuxfdpiceabi -TOP="$(pwd)" +# ================================================================== +# Версии пакетов +# ================================================================== +BINUTILS_VER="2.34" +GCC_VER="13.4.0" +LINUX_VER="4.9.224" +UCLIBC_VER="1.0.34" +# ================================================================== +# Основные параметры тулчейна +# ================================================================== +TARGET="arm-uclinuxfdpiceabi" +SUBARCH="armv7-m" +SUBMODE="thumb" + +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" @@ -15,68 +27,61 @@ KERNEL_SYSROOT_USR_INCLUDES_DIR="${KERNEL_SYSROOT_USR_DIR}/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 +export CFLAGS=$CFLAGS_TOOLSET +export CFLAGS_FOR_TARGET=$CFLAGS_TARGET +export CXXFLAGS_FOR_TARGET=$CFLAGS_TARGET +# ================================================================== +# Имена распакованных директорий (обычно совпадают с версией) +# ================================================================== +SRC_BINUTILS="${BUILD_SRC_DIR}/binutils-${BINUTILS_VER}" +SRC_GCC="${BUILD_SRC_DIR}/gcc-${GCC_VER}" +SRC_LINUX="${BUILD_SRC_DIR}/linux-${LINUX_VER}" +SRC_UCLIBC="${BUILD_SRC_DIR}/uClibc-ng-${UCLIBC_VER}" + +# ================================================================== echo "== Создание директорий ==" -mkdir -p ${KERNEL_SYSROOT_DIR} -mkdir -p ${BUILD_SRC_DIR} +mkdir -p "${KERNEL_SYSROOT_DIR}" "${BUILD_SRC_DIR}" -####################################### -# РАСПАКОВКА В build/src -####################################### -echo "== Распаковка архивов в build/src ==" +echo "== Распаковка архивов в ${BUILD_SRC_DIR} ==" for f in *.tar.xz; do + [ -f "$f" ] || { echo "Нет архивов *.tar.xz в текущей директории!"; exit 1; } echo " * $f" - tar -xf "$f" -C ${BUILD_SRC_DIR} + 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} \ +# ================================================================== +echo "== Сборка binutils-${BINUTILS_VER} ==" +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 -j$(nproc) all make install -cd ../.. +cd ../../.. -####################################### -# GCC STAGE 1 -####################################### -echo "== Сборка GCC Stage 1 ==" +# ================================================================== +# GCC STAGE 1 (только C, без libc) +# ================================================================== +echo "== Сборка GCC-${GCC_VER} Stage 1 ==" -cd $SRC_GCC +cd "${SRC_GCC}" ./contrib/download_prerequisites cd ../../.. -mkdir -p build/gcc1 -cd build/gcc1 - -$SRC_GCC/configure \ - --target=${TARGET} \ - --prefix=${INSTALL_DIR} \ - --with-arch=${SUBARCH} \ - --with-mode=${SUBMODE} \ +mkdir -p build/gcc1 && cd build/gcc1 +"${SRC_GCC}/configure" \ + --target="${TARGET}" \ + --prefix="${INSTALL_DIR}" \ + --with-arch="${SUBARCH}" \ + --with-mode="${SUBMODE}" \ --without-headers \ --with-newlib \ --disable-shared \ @@ -92,57 +97,54 @@ $SRC_GCC/configure \ --disable-nls \ --disable-libatomic -make -j12 -make install -cd ../.. +make -j$(nproc) all-gcc +make install-gcc +make -j$(nproc) all-target-libgcc +make install-target-libgcc +cd ../../.. -####################################### -# LINUX HEADERS -####################################### -echo "== Установка заголовков linux ==" +# ================================================================== +# Linux headers +# ================================================================== +echo "== Установка заголовков linux-${LINUX_VER} ==" mkdir -p build/kernelheader -cd $SRC_LINUX +cd "${SRC_LINUX}" -PATH=${INSTALL_BIN_DIR}:${PATH} \ -make headers_install ARCH=arm \ - INSTALL_HDR_PATH=${KERNEL_SYSROOT_USR_DIR} \ - CROSS_COMPILE=${TARGET}- \ - O=${TOP}/build/kernelheader +PATH="${INSTALL_BIN_DIR}:${PATH}" \ +make ARCH=arm \ + INSTALL_HDR_PATH="${KERNEL_SYSROOT_USR_DIR}" \ + CROSS_COMPILE="${TARGET}-" \ + O="${TOP}/build/kernelheader" \ + headers_install +cd "${TOP}" -cd ../../.. +# ================================================================== +# uClibc-ng +# ================================================================== +echo "== Сборка uClibc-ng-${UCLIBC_VER} ==" +cd "${SRC_UCLIBC}" -####################################### -# UCLIBC -####################################### -echo "== Сборка uClibc ==" - -cd $SRC_UCLIBC - -# Удаляем старое значение -sed -i '/^KERNEL_HEADERS=/d' .config - -# Добавляем новое +# Перезаписываем путь к заголовкам ядра +sed -i '/^KERNEL_HEADERS=/d' .config 2>/dev/null || true echo "KERNEL_HEADERS=\"${KERNEL_SYSROOT_USR_INCLUDES_DIR}\"" >> .config -PATH=${TOP}/install/bin:${PATH} make all -j12 -PATH=${TOP}/install/bin:${PATH} make PREFIX=${KERNEL_SYSROOT_DIR} install -cd ../../.. +PATH="${INSTALL_BIN_DIR}:${PATH}" make oldconfig || true +PATH="${INSTALL_BIN_DIR}:${PATH}" make -j$(nproc) +PATH="${INSTALL_BIN_DIR}:${PATH}" make PREFIX="${KERNEL_SYSROOT_DIR}" install +cd "${TOP}" -####################################### -# 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} \ +# ================================================================== +# GCC FINAL (C + C++) +# ================================================================== +echo "== Сборка финального GCC-${GCC_VER} (C+C++) ==" +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 \ @@ -152,42 +154,33 @@ $SRC_GCC/configure \ --disable-libgomp \ --disable-libatomic -make -j12 +make -j$(nproc) make install -cd ../.. - -####################################### -# STRIP -####################################### -echo "== Strip toolchain ==" +cd "${TOP}" +# ================================================================== +# Strip и упаковка +# ================================================================== +echo "== Strip toolchain и упаковка ==" WDIR=$(mktemp -d) -trap "rm -Rf $WDIR" EXIT +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 +cp -a install/* "$WDIR"/ +find "$WDIR" -type f -executable -exec strip -p {} \; 2>/dev/null || true -tar -C "$WDIR" --atime-preserve -cJf "toolset-jlv-${SUBARCH}.tar.xz" . +tar -C "$WDIR" --owner=0 --group=0 -cJf "toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz" . +echo "Готово: toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz" -echo "== Готово ==" - -####################################### -# УПРАВЛЕНИЕ АРХИВАМИ -####################################### -echo "" -echo "=== Управление архивами ===" -echo "Собран тулчейн: toolset-jlv-${SUBARCH}.tar.xz" - -read -p "Удалить исходные архивы (*.tar.xz)? (y/N): " -n 1 -r +# ================================================================== +# Очистка +# ================================================================== echo -[[ $REPLY =~ ^[Yy]$ ]] && rm -f *.tar.xz && echo "Архивы удалены." +echo "=== Управление архивами и очистка ===" +read -p "Удалить исходники (*.tar.xz)? (y/N): " -n 1 -r REPLY; echo +[[ $REPLY =~ ^[Yy]$ ]] && rm -f *.tar.xz && echo "Исходные архивы удалены." + +read -p "Удалить директории сборки (build/, install/)? (y/N): " -n 1 -r REPLY; echo +[[ $REPLY =~ ^[Yy]$ ]] && rm -rf build install && echo "Директории сборки удалены." -echo "" -echo "=== Очистка временных файлов ===" -read -p "Удалить директории сборки (build/src и build/*)? (y/N): " -n 1 -r echo -[[ $REPLY =~ ^[Yy]$ ]] && rm -rf build && echo "Временные файлы удалены." - -echo "" -echo "== Сборка завершена полностью ==" +echo "== Сборка полностью завершена! ==" \ No newline at end of file