Compare commits

...

5 Commits

Author SHA1 Message Date
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
082098c9ec Add libnl support and update prerequisites in build scripts
- Enhanced build-libraries.sh to configure and build libnl version 3.2.0, including checks for required tools like flex and bison.
- Updated download_prerequisites.sh to include the download link for libnl.
- Modified README.md to document the addition of libnl and its dependencies.
- Set LIBNL_VER to 3.2.0 in versions.sh for consistency across scripts.
2026-04-06 14:56:50 +03:00
f7a908f096 Update build-toolchain.sh and README.md for toolchain environment script changes
- Modified build-toolchain.sh to copy env.sh from the scripts directory instead of the top-level directory, ensuring proper organization.
- Updated README.md to reflect the new version of uClibc-ng and clarify the structure of the output archive, including the location of env.sh within the archive.
2026-03-31 18:09:01 +03:00
fa5c892cce Enhance build-libraries.sh and env.sh for improved toolchain configuration
- Updated build-libraries.sh to set up environment variables for the arm-uclinuxfdpiceabi toolchain, including compiler flags and paths.
- Removed the dependency on env.sh for initial environment setup, simplifying the script logic.
- Streamlined the export and unset of environment variables to ensure a clean build environment.
- Adjusted the handling of CFLAGS and related variables for better clarity and consistency in the build process.
2026-03-31 17:20:11 +03:00
1f31c8e0a9 Add OpenSSL patch to include <sys/stat.h> in s_server.c
- Introduced a check in build-libraries.sh to add the <sys/stat.h> include directive to apps/s_server.c if it is missing.
- This patch ensures compatibility with systems that require this header for proper functionality of the OpenSSL s_server application.
2026-03-31 14:07:30 +03:00
8 changed files with 137 additions and 138 deletions

View File

@@ -11,7 +11,7 @@
| Binutils | 2.42 | Ассемблер, линковщик, утилиты | | Binutils | 2.42 | Ассемблер, линковщик, утилиты |
| GCC | 13.4.0 | Компилятор C/C++ | | GCC | 13.4.0 | Компилятор C/C++ |
| Linux (headers) | 4.9.224 | Заголовочные файлы ядра | | Linux (headers) | 4.9.224 | Заголовочные файлы ядра |
| uClibc-ng | 1.0.55 | Стандартная библиотека C | | uClibc-ng | 1.0.34 | Стандартная библиотека C |
### Дополнительные библиотеки ### Дополнительные библиотеки
@@ -21,6 +21,7 @@
| OpenSSL | 3.0.13 | Криптография | | OpenSSL | 3.0.13 | Криптография |
| LibVNCServer | 0.9.14 | VNC-сервер | | LibVNCServer | 0.9.14 | VNC-сервер |
| FreeType | 2.13.2 | Рендеринг шрифтов | | FreeType | 2.13.2 | Рендеринг шрифтов |
| libnl | 3.2.0 | Netlink для Linux |
Все библиотеки собираются статически. Все библиотеки собираются статически.
@@ -41,6 +42,8 @@
- cmake - cmake
- wget - wget
- bzip2 - bzip2
- bison (или yacc)
- flex
- tar - tar
- стандартные утилиты (grep, sed и т.д.) - стандартные утилиты (grep, sed и т.д.)
@@ -48,7 +51,7 @@
```bash ```bash
sudo apt update sudo apt update
sudo apt install -y make gcc g++ cmake wget bzip2 tar sed grep xz-utils sudo apt install -y make gcc g++ cmake wget bzip2 bison flex tar sed grep xz-utils
``` ```
## Использование ## Использование
@@ -78,45 +81,32 @@ sudo apt install -y make gcc g++ cmake wget bzip2 tar sed grep xz-utils
7. Сборка дополнительных библиотек 7. Сборка дополнительных библиотек
8. Упаковка результата в архив 8. Упаковка результата в архив
На выходе создаётся архив `toolset-jlv-armv7-m-gcc13.4.0-uclibc1.0.55.tar.xz`. На выходе создаётся архив `toolset-jlv-armv7-m-gcc13.4.0-uclibc1.0.34.tar.xz`. Внутри архива:
### 3. Настройка окружения - каталог `arm-uclinuxfdpiceabi/` — установленный тулчейн (как после `prefix`);
- файл `env.sh` в том же каталоге, что и `arm-uclinuxfdpiceabi/` (без отдельной папки `scripts`).
Есть два режима работы `env.sh`. В репозитории шаблон для упаковки лежит в `scripts/env.sh`, при сборке архива он копируется в корень как `env.sh`.
Обычный режим: ### 3. Настройка окружения после распаковки архива
Распакуйте архив в удобное место и перейдите в каталог, где лежат `arm-uclinuxfdpiceabi/` и `env.sh`:
```bash ```bash
tar -xf toolset-jlv-armv7-m-gcc13.4.0-uclibc1.0.34.tar.xz
cdаталог_распаковки>
source ./env.sh source ./env.sh
``` ```
Этот режим работает "как раньше": Скрипт задаёт `TOP` как текущий каталог, добавляет `${TOP}/arm-uclinuxfdpiceabi/bin` в `PATH`, выставляет `CFLAGS` / `CFLAGS_FOR_TARGET` / `CXXFLAGS_FOR_TARGET`, `SUBARCH` и `SUBMODE`.
- добавляет `${PWD}/arm-uclinuxfdpiceabi/bin` в `PATH`
- задаёт `CFLAGS`, `CFLAGS_FOR_TARGET`, `CXXFLAGS_FOR_TARGET`
- задаёт `SUBARCH=armv7-m` и `SUBMODE=thumb`
- не переопределяет `CC`/`CXX`, поэтому не мешает хостовой сборке под WSL
Режим полного toolchain-окружения:
```bash
source ./env.sh --toolchain /путь/к/install [arflags]
```
Этот режим используется сборочными скриптами и дополнительно устанавливает `CC`, `CXX`, `CPP`, `LD`, `AR`, `RANLIB`, `STRIP`, `OBJCOPY`, `OBJDUMP`, `SYSROOT`, `LDFLAGS` и добавляет путь к тулчейну в `PATH`.
Деактивация:
```bash
source ./env.sh --toolchain --unregister
```
## Флаги компиляции ## Флаги компиляции
| Переменная | Значение | Назначение | | Переменная | Значение | Назначение |
|------------|----------|------------| |------------|----------|------------|
| `CFLAGS` | `-O2` | Флаги хостовой/toolset-сборки по умолчанию | | `CFLAGS` | `-O2` | Базовые флаги оптимизации |
| `CFLAGS_FOR_TARGET` | `-Os -mthumb` | Оптимизация по размеру, Thumb-инструкции для target | | `CFLAGS_FOR_TARGET` | `-Os -mthumb` | Оптимизация по размеру, Thumb для target |
| `LDFLAGS` | `-Wl,--fdpic` | Линковка с поддержкой FDPIC | | `LDFLAGS` | `-Wl,--fdpic` | Линковка с поддержкой FDPIC (при полной настройке toolchain) |
## Структура каталогов ## Структура каталогов
@@ -124,16 +114,17 @@ source ./env.sh --toolchain --unregister
build-toolchain/ build-toolchain/
├── build-toolchain.sh # Основной скрипт сборки ├── build-toolchain.sh # Основной скрипт сборки
├── build-libraries.sh # Сборка дополнительных библиотек ├── build-libraries.sh # Сборка дополнительных библиотек
├── package-toolchain.sh # Упаковка готового тулчейна
├── download_prerequisites.sh # Загрузка исходников ├── download_prerequisites.sh # Загрузка исходников
├── env.sh # Настройка окружения ├── scripts/
│ └── env.sh # Настройка окружения (копируется в архив)
├── config/ # Конфигурации uClibc ├── config/ # Конфигурации uClibc
│ ├── config-uClibc-ng-1.0.34 │ ├── config-uClibc-ng-1.0.34
│ └── config-uClibc-ng-1.0.55 │ └──
├── src/ # Исходный код (после загрузки) ├── src/ # Исходный код (после загрузки)
│ ├── toolchain/ # Архивы компонентов тулчейна │ ├── toolchain/ # Архивы компонентов тулчейна
│ └── libs/ # Архивы библиотек │ └── libs/ # Архивы библиотек
── build/ # Каталог сборки (создаётся автоматически) ── build/ # Каталог сборки (создаётся автоматически)
└── install/ # Каталог установки (создаётся автоматически)
``` ```
## Лицензия ## Лицензия

View File

@@ -9,13 +9,38 @@ TOP="$(pwd)"
INSTALL_DIR="${TOP}/build/install" INSTALL_DIR="${TOP}/build/install"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin" INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
SYSROOT_DIR="${INSTALL_DIR}/sysroot" SYSROOT_DIR="${INSTALL_DIR}/sysroot"
TARGET="arm-uclinuxfdpiceabi"
TOOLCHAIN="${TARGET}"
TOOLCHAIN_PATH="${INSTALL_DIR}/bin"
CFLAGS_TOOLSET='-O2'
CFLAGS_TARGET='-Os -mthumb'
_ORIG_PATH="$PATH"
# Запускаем предварительно для того чтобы подтянуть переменные export SYSROOT="${SYSROOT_DIR}"
. ./env.sh --global --path "${INSTALL_DIR}" export PREFIX="${SYSROOT_DIR}/usr"
export TARGET TOOLCHAIN TOOLCHAIN_PATH
# Сбрасываем CFLAGS/CXXFLAGS — все флаги уже встроены в CC/CXX export CC="${TOOLCHAIN_PATH}/${TOOLCHAIN}-gcc ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}"
export CXX="${TOOLCHAIN_PATH}/${TOOLCHAIN}-g++ ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}"
export CPP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-cpp"
export LD="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ld"
export AR="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ar"
# Без флагов (rc) zlib/Makefile вызывает «ar libz.a …» — ar воспринимает имя архива как опции.
export ARFLAGS='rc'
export AS="${TOOLCHAIN_PATH}/${TOOLCHAIN}-as"
export NM="${TOOLCHAIN_PATH}/${TOOLCHAIN}-nm"
export RANLIB="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ranlib"
export STRIP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-strip"
export OBJCOPY="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objcopy"
export OBJDUMP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objdump"
export CFLAGS="" export CFLAGS=""
export CXXFLAGS="" export CXXFLAGS=""
export LDFLAGS=""
export CFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
export CXXFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
export LDFLAGS_FOR_TARGET='-Wl,--fdpic'
export SUBARCH=armv7-m
export SUBMODE=thumb
export PATH="${TOOLCHAIN_PATH}:${_ORIG_PATH}"
# Подготавливаем пути к разделам # Подготавливаем пути к разделам
@@ -25,22 +50,6 @@ SYSROOT_USR_DIR="${SYSROOT_DIR}/usr"
BUILD_SRC_DIR="${TOP}/build" BUILD_SRC_DIR="${TOP}/build"
LIB_BUILD_DIR="${BUILD_SRC_DIR}/src/libs" LIB_BUILD_DIR="${BUILD_SRC_DIR}/src/libs"
# ==================================================================
# Проверка файла окружения
# ==================================================================
# Проверяем существует ли файл
if [ ! -f ./env.sh ]; then
echo "Ошибка: файл env.sh не найден"
exit 1
fi
# Проверяем имеет ли файл права на исполнение
if [ ! -x ./env.sh ]; then
echo "env.sh не имеет права на выполнение, добавляю..."
chmod +x ./env.sh || { echo "Не удалось установить права"; exit 1; }
fi
# ================================================================== # ==================================================================
# Распаковка библиотек # Распаковка библиотек
# ================================================================== # ==================================================================
@@ -73,15 +82,6 @@ shopt -u nullglob
echo "== Распаковка завершена ==" echo "== Распаковка завершена =="
# ==================================================================
# Установка окружения
# ==================================================================
cd "${TOP}"
. ./env.sh --global --path "${INSTALL_DIR}"
export CFLAGS=""
export CXXFLAGS=""
cd "${LIB_BUILD_DIR}/zlib-${ZLIB_VER}" cd "${LIB_BUILD_DIR}/zlib-${ZLIB_VER}"
./configure --prefix=${SYSROOT_USR_DIR} --libdir=${SYSROOT_USR_DIR}/lib --static ./configure --prefix=${SYSROOT_USR_DIR} --libdir=${SYSROOT_USR_DIR}/lib --static
make -j$(nproc) make -j$(nproc)
@@ -89,10 +89,35 @@ make install
# ================================================================== # ==================================================================
cd "${TOP}" cd "${LIB_BUILD_DIR}/libnl-${LIBNL_VER}"
. ./env.sh --global --path "${INSTALL_DIR}" if ! command -v flex >/dev/null 2>&1; then
export CFLAGS="" echo "Ошибка: для сборки libnl нужен flex (пакет flex)."
export CXXFLAGS="" exit 1
fi
if ! command -v bison >/dev/null 2>&1; then
echo "Ошибка: для сборки libnl нужен bison (byacc не подходит)."
exit 1
fi
export YACC="bison -y"
export LEX="flex"
./configure \
--host="${TARGET}" \
--prefix="${SYSROOT_USR_DIR}" \
--libdir="${SYSROOT_USR_DIR}/lib" \
--disable-shared \
--enable-static \
--disable-cli
make -j$(nproc)
make install
unset YACC LEX
# ==================================================================
OPENSSL_S_SERVER_FILE="${LIB_BUILD_DIR}/openssl-${OPENSSL_VER}/apps/s_server.c"
if [ -f "${OPENSSL_S_SERVER_FILE}" ] && ! grep -q '^#include <sys/stat.h>$' "${OPENSSL_S_SERVER_FILE}"; then
echo "== Патч OpenSSL: добавляю <sys/stat.h> в apps/s_server.c =="
sed -i '/^#ifndef OPENSSL_NO_SOCK/i #include <sys/stat.h>' "${OPENSSL_S_SERVER_FILE}"
fi
cd "${LIB_BUILD_DIR}/openssl-${OPENSSL_VER}" cd "${LIB_BUILD_DIR}/openssl-${OPENSSL_VER}"
./Configure linux-armv4 \ ./Configure linux-armv4 \
@@ -173,4 +198,10 @@ make install
# ================================================================== # ==================================================================
cd "${TOP}" cd "${TOP}"
export PATH="${_ORIG_PATH}"
unset SYSROOT PREFIX TARGET TOOLCHAIN TOOLCHAIN_PATH
unset CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP
unset CFLAGS CXXFLAGS LDFLAGS
unset CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET
unset SUBARCH SUBMODE CFLAGS_TOOLSET CFLAGS_TARGET _ORIG_PATH

View File

@@ -211,21 +211,8 @@ cd "${TOP}"
# ================================================================== # ==================================================================
# Strip и упаковка # Strip и упаковка
# ================================================================== # ==================================================================
echo "== Strip toolchain и упаковка =="
cd "${TOP}" cd "${TOP}"
WDIR=$(mktemp -d) bash ./package-toolchain.sh "${TARGET}" "${SUBARCH}" "${INSTALL_DIR}"
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"
# ================================================================== # ==================================================================
# Очистка # Очистка

View File

@@ -42,6 +42,7 @@ toolchain_files=(
# Исходники библиотек # Исходники библиотек
libs_files=( libs_files=(
"https://www.infradead.org/~tgr/libnl/files/libnl-${LIBNL_VER}.tar.gz"
"https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VER}.tar.gz" "https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VER}.tar.gz"
"https://github.com/LibVNC/libvncserver/archive/LibVNCServer-${LIBVNCSERVER_VER}.tar.gz" "https://github.com/LibVNC/libvncserver/archive/LibVNCServer-${LIBVNCSERVER_VER}.tar.gz"
"https://www.openssl.org/source/openssl-${OPENSSL_VER}.tar.gz" "https://www.openssl.org/source/openssl-${OPENSSL_VER}.tar.gz"

58
env.sh
View File

@@ -1,58 +0,0 @@
TOP="$(pwd)"
TOOLCHAIN_PATH=""
GLOBAL_MODE=0
CUSTOM_PATH=""
while [ $# -gt 0 ]; do
case "$1" in
--global)
GLOBAL_MODE=1
shift
;;
--path)
if [ -z "$2" ]; then
echo "Ошибка: для --path нужно указать путь"
return 1 2>/dev/null || exit 1
fi
CUSTOM_PATH="$2"
shift 2
;;
*)
shift
;;
esac
done
if [ -n "${CUSTOM_PATH}" ]; then
TOOLCHAIN_PATH="${CUSTOM_PATH}"
elif [ -d "${TOP}/arm-uclinuxfdpiceabi" ]; then
TOOLCHAIN_PATH="${TOP}/arm-uclinuxfdpiceabi"
elif [ -d "${TOP}/build/install" ]; then
TOOLCHAIN_PATH="${TOP}/build/install"
fi
if [ -n "${TOOLCHAIN_PATH}" ] && [ -x "${TOOLCHAIN_PATH}/bin/arm-uclinuxfdpiceabi-gcc" ]; then
echo "Найден toolchain: ${TOOLCHAIN_PATH}/bin/arm-uclinuxfdpiceabi-gcc"
CFLAGS_TOOLSET='-O2'
CFLAGS_TARGET='-Os -mthumb'
SUBARCH=armv7-m
SUBMODE=thumb
if [ "$GLOBAL_MODE" -eq 1 ]; then
export CFLAGS="${CFLAGS_TOOLSET}"
export CFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
export CXXFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
export SUBARCH
export SUBMODE
export PATH="${TOOLCHAIN_PATH}/bin:${PATH}"
else
CFLAGS="${CFLAGS_TOOLSET}"
CFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
CXXFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
PATH="${TOOLCHAIN_PATH}/bin:${PATH}"
fi
else
echo "Ошибка: не найден ${TOOLCHAIN_PATH}/bin/arm-uclinuxfdpiceabi-gcc"
return 1 2>/dev/null || exit 1
fi

36
package-toolchain.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
set -e
source "$(dirname "$0")/versions.sh"
TOP="$(pwd)"
TARGET="${1:-arm-uclinuxfdpiceabi}"
SUBARCH="${2:-armv7-m}"
INSTALL_DIR="${3:-${TOP}/build/install}"
if [ ! -d "${INSTALL_DIR}" ]; then
echo "Ошибка: директория установки не найдена: ${INSTALL_DIR}"
exit 1
fi
if [ ! -f "${TOP}/scripts/env.sh" ]; then
echo "Ошибка: файл окружения не найден: ${TOP}/scripts/env.sh"
exit 1
fi
echo "== Strip toolchain и упаковка =="
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}/scripts/env.sh" "${WDIR}/env.sh"
find "${ARCHIVE_TOOLCHAIN_DIR}" -type f -executable -exec strip -p {} \; 2>/dev/null || true
ARCHIVE_NAME="toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz"
tar -C "${WDIR}" --owner=0 --group=0 -cJf "${ARCHIVE_NAME}" "${TARGET}" "env.sh"
echo "Готово: ${ARCHIVE_NAME}"

10
scripts/env.sh Executable file
View File

@@ -0,0 +1,10 @@
TOP=`pwd`
TARGET=arm-uclinuxfdpiceabi
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
PATH=${TOP}/${TARGET}/bin:${PATH}

View File

@@ -13,3 +13,4 @@ ZLIB_VER="1.2.13"
OPENSSL_VER="3.0.13" OPENSSL_VER="3.0.13"
LIBVNCSERVER_VER="0.9.14" LIBVNCSERVER_VER="0.9.14"
FREETYPE_VER="2.13.2" FREETYPE_VER="2.13.2"
LIBNL_VER="3.2.0"