#!/bin/bash set -e source "$(dirname "$0")/versions.sh" # Подготавливаем переменные TOP="$(pwd)" INSTALL_DIR="${TOP}/build/install" INSTALL_BIN_DIR="${INSTALL_DIR}/bin" 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}" export PREFIX="${SYSROOT_DIR}/usr" export TARGET TOOLCHAIN TOOLCHAIN_PATH 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 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}" # Подготавливаем пути к разделам LIB_DIR="${TOP}/src/libs" SYSROOT_ETC_DIR="${SYSROOT_DIR}/etc" SYSROOT_USR_DIR="${SYSROOT_DIR}/usr" BUILD_SRC_DIR="${TOP}/build" LIB_BUILD_DIR="${BUILD_SRC_DIR}/src/libs" # ================================================================== # Распаковка библиотек # ================================================================== echo "== Распаковка библиотек ==" # Создаем каталог для сборки библиотек mkdir -p "${LIB_BUILD_DIR}" echo "== Поиск и распаковка архивов в ${LIB_DIR} ==" # Проходимся по *.tar.xz и *.tar.gz shopt -s nullglob for archive in "${LIB_DIR}"/*.tar.xz "${LIB_DIR}"/*.tar.gz; do # Если файлов нет – ничего не делаем [ -e "$archive" ] || continue fname="$(basename "$archive")" pkg="${fname%.tar.*}" # имя папки после распаковки echo "--------------------------------------" echo "Найден архив: $fname" echo "Распаковка в: ${LIB_BUILD_DIR}/${pkg}" echo "--------------------------------------" mkdir -p "${LIB_BUILD_DIR}/${pkg}" tar -xf "$archive" -C "${LIB_BUILD_DIR}/${pkg}" --strip-components=1 done shopt -u nullglob echo "== Распаковка завершена ==" cd "${LIB_BUILD_DIR}/zlib-${ZLIB_VER}" ./configure --prefix=${SYSROOT_USR_DIR} --libdir=${SYSROOT_USR_DIR}/lib --static make -j$(nproc) make install # ================================================================== cd "${LIB_BUILD_DIR}/libnl-${LIBNL_VER}" if ! command -v flex >/dev/null 2>&1; then echo "Ошибка: для сборки libnl нужен flex (пакет flex)." 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 $' "${OPENSSL_S_SERVER_FILE}"; then echo "== Патч OpenSSL: добавляю в apps/s_server.c ==" sed -i '/^#ifndef OPENSSL_NO_SOCK/i #include ' "${OPENSSL_S_SERVER_FILE}" fi cd "${LIB_BUILD_DIR}/openssl-${OPENSSL_VER}" ./Configure linux-armv4 \ --prefix=${SYSROOT_USR_DIR} \ --libdir=${SYSROOT_USR_DIR}/lib \ --openssldir=${SYSROOT_ETC_DIR}/ssl \ enable-legacy no-mdc2 no-rc5 no-ec2m no-sm2 no-sm4 no-ssl3 \ no-shared no-dso no-async no-comp no-idea no-tests no-threads no-asm no-secure-memory no-seed no-weak-ssl-ciphers \ no-afalgeng no-aria no-async no-bf no-blake2 no-camellia no-capieng no-cast no-chacha no-cms no-cmp no-ct \ no-dgram no-dsa no-dtls no-ecdh no-ecdsa no-engine no-err no-filenames no-gost \ no-ocsp no-pinshared no-poly1305 no-posix-io no-rc2 no-rc4 no-rdrand no-rfc3779 no-rmd160 no-scrypt no-sctp no-siphash \ no-sm3 no-srp no-srtp no-ssl-trace no-ssl3 no-ssl3-method no-ts no-whirlpool enable-ktls \ -DNO_FORK -DHAVE_FORK=0 make -j$(nproc) build_libs make install_sw # ================================================================== cd "${LIB_BUILD_DIR}/LibVNCServer-${LIBVNCSERVER_VER}" rm -rf build mkdir -p build && cd build cmake -S .. -B . \ -DBUILD_SHARED_LIBS=OFF \ -DWITH_THREADS=OFF \ -DWITH_TESTS=OFF \ -DWITH_EXAMPLES=OFF \ -DWITH_ZLIB=OFF \ -DWITH_LZO=OFF \ -DWITH_JPEG=OFF \ -DWITH_PNG=OFF \ -DWITH_SDL=OFF \ -DWITH_GTK=OFF \ -DWITH_LIBSSH2=OFF \ -DWITH_GNUTLS=OFF \ -DWITH_GCRYPT=OFF \ -DWITH_FFMPEG=OFF \ -DWITH_TIGHTVNC_FILETRANSFER=OFF \ -WITH_IPv6=ON \ -DWITH_WEBSOCKETS=OFF \ -DWITH_SASL=OFF \ -DWITH_OPENSSL=OFF \ -DOPENSSL_ROOT_DIR="${SYSROOT_USR_DIR}" \ -DOPENSSL_LIBRARIES="${SYSROOT_USR_DIR}/lib/libssl.a;${SYSROOT_USR_DIR}/lib/libcrypto.a" \ -DOPENSSL_INCLUDE_DIR="${SYSROOT_USR_DIR}/include" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_FIND_ROOT_PATH="${SYSROOT_DIR}" \ -DCMAKE_SYSROOT="${SYSROOT_DIR}" \ -DCMAKE_STAGING_PREFIX="${SYSROOT_USR_DIR}" make -j$(nproc) make install # ================================================================== cd "${LIB_BUILD_DIR}/freetype-${FREETYPE_VER}" [ -d "build" ] && rm -rf build mkdir -p build && cd build cmake -S .. -B . \ -DCMAKE_BUILD_TYPE=Release \ -DFT_DISABLE_HARFBUZZ=ON \ -DBUILD_SHARED_LIBS=OFF \ -DFT_DISABLE_BROTLI=ON \ -DFT_DISABLE_BZIP2=ON \ -DFT_DISABLE_PNG=ON \ -DFT_DISABLE_DOCS=ON \ -DFT_DISABLE_TESTS=ON \ -DCMAKE_INSTALL_PREFIX="${SYSROOT_USR_DIR}" \ -DCMAKE_FIND_ROOT_PATH="${SYSROOT_DIR}" \ -DCMAKE_SYSROOT="${SYSROOT_DIR}" \ -DCMAKE_STAGING_PREFIX="${SYSROOT_USR_DIR}" \ -DZLIB_LIBRARY="${SYSROOT_USR_DIR}/lib/libz.a" \ -DZLIB_INCLUDE_DIR="${SYSROOT_USR_DIR}/include" \ -DZLIB_USE_STATIC=ON make -j$(nproc) make install # ================================================================== 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