diff --git a/.gitignore b/.gitignore index 554cde0..56e581b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ +build +install *.tar.xz \ No newline at end of file diff --git a/build-toolchain.sh b/build-toolchain.sh index 3f3badb..77bda36 100755 --- a/build-toolchain.sh +++ b/build-toolchain.sh @@ -4,6 +4,14 @@ 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 @@ -13,47 +21,57 @@ SUBARCH=armv7-m SUBMODE=thumb echo "== Создание директорий ==" -mkdir -p install -mkdir -p install/sysroot +mkdir -p ${KERNEL_SYSROOT_DIR} +mkdir -p ${BUILD_SRC_DIR} -echo "== Распаковка архивов ==" +####################################### +# РАСПАКОВКА В build/src +####################################### +echo "== Распаковка архивов в build/src ==" for f in *.tar.xz; do echo " * $f" - tar -xf "$f" + tar -xf "$f" -C ${BUILD_SRC_DIR} done -############### -# BINUTILS -############### -echo "== Сборка binutils ==" -mkdir -p build-binutils -cd build-binutils +# Пути на исходники +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-2.34/configure \ +####################################### +# BINUTILS +####################################### +echo "== Сборка binutils ==" + +mkdir -p build/binutils +cd build/binutils + +$SRC_BINUTILS/configure \ --target=${TARGET} \ - --prefix=${TOP}/install \ - --with-sysroot=${TOP}/install/sysroot \ + --prefix=${INSTALL_DIR} \ + --with-sysroot=${KERNEL_SYSROOT_DIR} \ --disable-nls \ --without-bugurl \ --disable-werror make -j12 make install -cd .. +cd ../.. -############### -# GCC STAGE1 -############### +####################################### +# GCC STAGE 1 +####################################### echo "== Сборка GCC Stage 1 ==" -cd gcc-13.4.0 +cd $SRC_GCC ./contrib/download_prerequisites -cd .. +cd ../../.. -mkdir -p build-gcc1 -cd build-gcc1 +mkdir -p build/gcc1 +cd build/gcc1 -../gcc-13.4.0/configure \ +$SRC_GCC/configure \ --target=${TARGET} \ --prefix=${TOP}/install \ --with-arch=${SUBARCH} \ @@ -75,45 +93,53 @@ cd build-gcc1 make -j12 make install -cd .. +cd ../.. -############### +####################################### # LINUX HEADERS -############### +####################################### echo "== Установка заголовков linux ==" -cd linux-4.9.224 -PATH=${TOP}/install/bin:${PATH} \ +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 .. -############### +cd ../../.. + +####################################### # UCLIBC -############### +####################################### echo "== Сборка uClibc ==" -cd uClibc-ng-1.0.34 -# TODO: конфигурировать или вставить .config при необходимости +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 .. +cd ../../.. -############### +####################################### # GCC FINAL -############### +####################################### echo "== Сборка финального GCC ==" -mkdir -p build-gcc2 -cd build-gcc2 +mkdir -p build/gcc2 +cd build/gcc2 -../gcc-13.4.0/configure \ +$SRC_GCC/configure \ --target=${TARGET} \ - --prefix=${TOP}/install \ - --with-sysroot=${TOP}/install/sysroot \ + --prefix=${INSTALL_DIR} \ + --with-sysroot=${KERNEL_SYSROOT_DIR} \ --with-arch=${SUBARCH} \ --with-mode=${SUBMODE} \ --enable-languages=c,c++ \ @@ -127,11 +153,11 @@ cd build-gcc2 make -j12 make install -cd .. +cd ../.. -############### +####################################### # STRIP -############### +####################################### echo "== Strip toolchain ==" WDIR=$(mktemp -d) @@ -145,34 +171,22 @@ tar -C $WDIR --atime-preserve -czf toolset-jlv-${SUBARCH}.tgz . echo "== Готово ==" -############### -# CLEAR -############### +####################################### +# УПРАВЛЕНИЕ АРХИВАМИ +####################################### echo "" echo "=== Управление архивами ===" echo "Собрана тулчейн: toolset-jlv-${SUBARCH}.tgz" read -p "Удалить исходные архивы (*.tar.xz)? (y/N): " -n 1 -r echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "Удаление архивов..." - rm -f *.tar.xz - echo "Архивы удалены." -else - echo "Архивы сохранены." -fi +[[ $REPLY =~ ^[Yy]$ ]] && rm -f *.tar.xz && echo "Архивы удалены." echo "" echo "=== Очистка временных файлов ===" -read -p "Удалить директории сборки (build-*, исходники)? (y/N): " -n 1 -r +read -p "Удалить директории сборки (build/src и build/*)? (y/N): " -n 1 -r echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "Удаление временных директорий..." - rm -rf build-* binutils-* gcc-* linux-* uClibc-* - echo "Временные файлы удалены." -else - echo "Временные файлы сохранены." -fi +[[ $REPLY =~ ^[Yy]$ ]] && rm -rf build && echo "Временные файлы удалены." echo "" -echo "== Сборка завершена полностью ==" \ No newline at end of file +echo "== Сборка завершена полностью =="