Files
build-toolchain/build-toolchain.sh
Egor Tsyganchuk b4ad220386 Refactor build-toolchain.sh to improve toolchain archiving process
- Created a dedicated directory for the target toolchain within the temporary working directory.
- Copied the environment script to the working directory for inclusion in the archive.
- Updated the tar command to include the target directory and environment script in the final archive, enhancing organization and clarity.
2026-03-30 20:01:11 +03:00

242 lines
8.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
# ==================================================================
# Названия пакетов
# ==================================================================
PKG_BINUTILS="binutils"
PKG_GCC="gcc"
PKG_LINUX="linux"
PKG_UCLIBC="uClibc-ng"
# ==================================================================
# Версии пакетов
# ==================================================================
source "$(dirname "$0")/versions.sh"
# ==================================================================
# Основные параметры тулчейна
# ==================================================================
TARGET="arm-uclinuxfdpiceabi"
SUBARCH="armv7-m"
SUBMODE="thumb"
TOP="$(pwd)"
CONFIGS_DIR="${TOP}/config"
SRC_DIR="${TOP}/src/toolchain"
BUILD_DIR="${TOP}/build"
BUILD_SRC_DIR="${BUILD_DIR}/src/toolchain"
INSTALL_DIR="${BUILD_DIR}/install"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
KERNEL_SYSROOT_DIR="${INSTALL_DIR}/sysroot"
KERNEL_SYSROOT_USR_DIR="${KERNEL_SYSROOT_DIR}/usr"
KERNEL_SYSROOT_USR_INCLUDES_DIR="${KERNEL_SYSROOT_USR_DIR}/include"
CFLAGS_TOOLSET='-O2'
CFLAGS_TARGET='-Os -mthumb'
export CFLAGS=$CFLAGS_TOOLSET
export CFLAGS_FOR_TARGET=$CFLAGS_TARGET
export CXXFLAGS_FOR_TARGET=$CFLAGS_TARGET
# ==================================================================
# Имена распакованных директорий (обычно совпадают с версией)
# ==================================================================
SRC_BINUTILS="${BUILD_SRC_DIR}/${PKG_BINUTILS}-${BINUTILS_VER}"
SRC_GCC="${BUILD_SRC_DIR}/${PKG_GCC}-${GCC_VER}"
SRC_LINUX="${BUILD_SRC_DIR}/${PKG_LINUX}-${LINUX_VER}"
SRC_UCLIBC="${BUILD_SRC_DIR}/${PKG_UCLIBC}-${UCLIBC_VER}"
# ==================================================================
echo "== Очистка и создание директорий =="
rm -rf "${BUILD_DIR}"
mkdir -p "${KERNEL_SYSROOT_DIR}" "${BUILD_SRC_DIR}"
echo "== Распаковка архивов из ${SRC_DIR} в ${BUILD_SRC_DIR} =="
ARCHIVES=(
"${SRC_DIR}/${PKG_BINUTILS}-${BINUTILS_VER}.tar.xz"
"${SRC_DIR}/${PKG_GCC}-${GCC_VER}.tar.xz"
"${SRC_DIR}/${PKG_LINUX}-${LINUX_VER}.tar.xz"
"${SRC_DIR}/${PKG_UCLIBC}-${UCLIBC_VER}.tar.xz"
)
for f in "${ARCHIVES[@]}"; do
if [ ! -f "$f" ]; then
echo "Ошибка: архив не найден: $f"
exit 1
fi
dirname="$(basename "${f%.tar.*}")"
if [ -d "${BUILD_SRC_DIR}/${dirname}" ]; then
echo " * Пропуск (уже распакован): ${dirname}"
continue
fi
echo " * Распаковка: $(basename "$f")"
tar -xf "$f" -C "${BUILD_SRC_DIR}"
done
# ==================================================================
# BINUTILS
# ==================================================================
echo "== Сборка binutils-${BINUTILS_VER} =="
mkdir -p "${BUILD_DIR}/binutils" && cd "${BUILD_DIR}/binutils"
"${SRC_BINUTILS}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
--with-sysroot="${KERNEL_SYSROOT_DIR}" \
--disable-nls \
--without-bugurl \
--disable-werror \
MAKEINFO=true
make -j$(nproc) MAKEINFO=true all
make MAKEINFO=true install
cd "${TOP}"
# ==================================================================
# GCC STAGE 1 (только C, без libc)
# ==================================================================
echo "== Сборка GCC-${GCC_VER} Stage 1 =="
cd "${SRC_GCC}"
./contrib/download_prerequisites
cd "${TOP}"
mkdir -p "${BUILD_DIR}/gcc1" && cd "${BUILD_DIR}/gcc1"
"${SRC_GCC}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
--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 \
--disable-libitm \
--without-cloog \
--without-ppl \
--disable-nls \
--disable-libatomic
make -j$(nproc) all-gcc
make install-gcc
make -j$(nproc) all-target-libgcc
make install-target-libgcc
cd "${TOP}"
# ==================================================================
# Linux headers
# ==================================================================
echo "== Установка заголовков linux-${LINUX_VER} =="
mkdir -p "${BUILD_DIR}/kernelheader"
cd "${SRC_LINUX}"
PATH="${INSTALL_BIN_DIR}:${PATH}" \
make ARCH=arm \
INSTALL_HDR_PATH="${KERNEL_SYSROOT_USR_DIR}" \
CROSS_COMPILE="${TARGET}-" \
O="${BUILD_DIR}/kernelheader" \
headers_install
cd "${TOP}"
# ==================================================================
# uClibc-ng
# ==================================================================
echo "== Сборка uClibc-ng-${UCLIBC_VER} =="
cd "${SRC_UCLIBC}"
# Подготовка .config перед сборкой uClibc-ng
CONFIG_SRC_FILE="${CONFIGS_DIR}/config-${PKG_UCLIBC}-${UCLIBC_VER}"
# Если в TOP существует .config-<версия uclibc>, копируем его
if [ -f "${CONFIG_SRC_FILE}" ]; then
echo "== Найден ${CONFIG_SRC_FILE}, копирую в .config =="
cp "${CONFIG_SRC_FILE}" .config
else
echo "== Файл ${CONFIG_SRC_FILE} не найден, используем существующий .config =="
fi
# Обновляем путь к заголовкам ядра — сначала удаляем старую строку
sed -i '/^KERNEL_HEADERS=/d' .config 2>/dev/null || true
# Добавляем новый путь
echo "KERNEL_HEADERS=\"${KERNEL_SYSROOT_USR_INCLUDES_DIR}\"" >> .config
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 (C + C++)
# ==================================================================
echo "== Сборка финального GCC-${GCC_VER} (C+C++) =="
mkdir -p "${BUILD_DIR}/gcc2" && cd "${BUILD_DIR}/gcc2"
"${SRC_GCC}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
--with-sysroot="${KERNEL_SYSROOT_DIR}" \
--with-arch="${SUBARCH}" \
--with-mode="${SUBMODE}" \
--enable-languages=c,c++ \
--disable-threads \
--enable-fdpic \
--disable-libstdcxx-pch \
--disable-libitm \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp \
--disable-libatomic
make -j$(nproc)
make install
cd "${TOP}"
# ==================================================================
# Установка библиотек
# ==================================================================
./build-libraries.sh
# ==================================================================
# Strip и упаковка
# ==================================================================
echo "== Strip toolchain и упаковка =="
cd "${TOP}"
WDIR=$(mktemp -d)
trap 'rm -rf "$WDIR"' EXIT
ARCHIVE_TOOLCHAIN_DIR="${WDIR}/${TARGET}"
mkdir -p "${ARCHIVE_TOOLCHAIN_DIR}"
cp -a "${INSTALL_DIR}"/* "${ARCHIVE_TOOLCHAIN_DIR}/"
cp -a "${TOP}/env.sh" "${WDIR}/env.sh"
find "${ARCHIVE_TOOLCHAIN_DIR}" -type f -executable -exec strip -p {} \; 2>/dev/null || true
tar -C "$WDIR" --owner=0 --group=0 -cJf "toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz" "${TARGET}" "env.sh"
echo "Готово: toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz"
# ==================================================================
# Очистка
# ==================================================================
echo
echo "=== Управление архивами и очистка ==="
read -p "Удалить исходники (src/)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -rf "${SRC_DIR}" && echo "Директория исходников удалена."
read -p "Удалить директорию сборки (build/)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -rf "${BUILD_DIR}" && echo "Директория сборки удалена."
echo
echo "== Сборка полностью завершена! =="