Files
build-toolchain/build-toolchain.sh
Egor Tsyganchuk 8267e2e4da Refactor toolchain packaging process by introducing package-toolchain.sh
- Replaced the packaging logic in build-toolchain.sh with a call to the new package-toolchain.sh script for better organization and maintainability.
- Added package-toolchain.sh to handle the stripping and archiving of the toolchain, including necessary checks for the installation directory and environment script.
- Updated README.md to document the addition of package-toolchain.sh for clarity on the build process.
2026-04-06 15:09:07 +03:00

229 lines
7.6 KiB
Bash
Executable File
Raw Permalink 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 и упаковка
# ==================================================================
cd "${TOP}"
bash ./package-toolchain.sh "${TARGET}" "${SUBARCH}" "${INSTALL_DIR}"
# ==================================================================
# Очистка
# ==================================================================
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 "== Сборка полностью завершена! =="