Script has been supplemented

This commit is contained in:
2025-12-04 15:57:34 +03:00
parent 96056d2f56
commit 446b697ba6

View File

@@ -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 "== Сборка полностью завершена! =="