123 lines
5.8 KiB
Bash
Executable File
123 lines
5.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# build_deps.sh — кросс-сборка статических armhf-зависимостей в $XARM
|
||
# Собирает: FFTW 3.3.10 (single+NEON), liquid-dsp 1.8.0, libiio (local backend),
|
||
# libad9361-iio (FIR-фильтр для sample rate < 2.083 MSPS)
|
||
# Запуск: scripts/build_deps.sh (один раз, ~15-20 мин на RPi4)
|
||
set -euo pipefail
|
||
source "$(dirname "$0")/../toolchain.env"
|
||
|
||
WORK="$HOME/src"
|
||
mkdir -p "$WORK" "$XARM"
|
||
cd "$WORK"
|
||
|
||
echo "=== [0/4] Проверка тулчейна ==="
|
||
which "${CC}" >/dev/null || {
|
||
echo "Нет ${CC}. Установи: sudo apt install gcc-arm-linux-gnueabihf"; exit 1; }
|
||
sudo apt-get install -y build-essential autoconf automake libtool git wget cmake >/dev/null
|
||
|
||
echo "=== [1/4] FFTW 3.3.10 (float + NEON, static) ==="
|
||
if [ ! -f "$XARM/lib/libfftw3f.a" ]; then
|
||
[ -d fftw-3.3.10 ] || {
|
||
wget -nc http://fftw.org/fftw-3.3.10.tar.gz
|
||
tar xf fftw-3.3.10.tar.gz
|
||
}
|
||
cd fftw-3.3.10
|
||
./configure --host=arm-linux-gnueabihf --prefix="$XARM" \
|
||
--enable-single --enable-neon --enable-static --disable-shared \
|
||
CC="$CC" CFLAGS="$XCFLAGS"
|
||
make -j"$(nproc)" && make install
|
||
cd "$WORK"
|
||
else
|
||
echo "уже собран, пропускаю"
|
||
fi
|
||
|
||
echo "=== [2/4] liquid-dsp 1.8.0 (static, с FFTW) ==="
|
||
if [ ! -f "$XARM/lib/libliquid.a" ]; then
|
||
[ -d liquid-dsp ] || git clone --depth 1 --branch v1.8.0 \
|
||
https://github.com/jgaeddert/liquid-dsp.git
|
||
cd liquid-dsp
|
||
./bootstrap.sh
|
||
./configure --host=arm-linux-gnueabihf --prefix="$XARM" \
|
||
CC="$CC" CFLAGS="$XCFLAGS -ffast-math" \
|
||
CPPFLAGS="-I$XARM/include" LDFLAGS="-L$XARM/lib" \
|
||
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
|
||
# КРИТИЧНО: без FFTW liquid молча падает на медленный встроенный FFT,
|
||
# и бюджет CPU из docs/BENCHMARK.md становится невалидным.
|
||
grep -q "HAVE_LIBFFTW3F 1" config.log || {
|
||
echo "ОШИБКА: liquid не нашёл кросс-FFTW — проверь \$XARM"; exit 1; }
|
||
make -j"$(nproc)" && make install
|
||
cd "$WORK"
|
||
else
|
||
echo "уже собран, пропускаю"
|
||
fi
|
||
|
||
echo "=== [3/5] libiio v0.25 (static, только local backend) ==="
|
||
if [ ! -f "$XARM/lib/libiio.a" ]; then
|
||
[ -d libiio ] || git clone --depth 1 --branch v0.25 \
|
||
https://github.com/analogdevicesinc/libiio.git
|
||
cd libiio
|
||
|
||
# ХАК: Полностью перезаписываем статус Threads, чтобы CMake даже не заходил в модуль проверки
|
||
sed -i '/find_package(Threads/c\set(Threads_FOUND ON)\nset(CMAKE_THREAD_LIBS_INIT "-lpthread")\nset(CMAKE_HAVE_PTHREADS_CREATE ON)\nadd_library(Threads::Threads INTERFACE IMPORTED)\nset_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES "-lpthread")' CMakeLists.txt
|
||
|
||
cat > toolchain-armhf.cmake <<EOF
|
||
set(CMAKE_SYSTEM_NAME Linux)
|
||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||
set(CMAKE_C_COMPILER ${CROSS}gcc)
|
||
set(CMAKE_C_FLAGS_INIT "$XCFLAGS")
|
||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||
EOF
|
||
cmake -B build-armhf -DCMAKE_TOOLCHAIN_FILE=toolchain-armhf.cmake \
|
||
-DCMAKE_INSTALL_PREFIX="$XARM" -DCMAKE_BUILD_TYPE=Release \
|
||
-DBUILD_SHARED_LIBS=OFF \
|
||
-DWITH_LOCAL_BACKEND=ON -DWITH_NETWORK_BACKEND=OFF \
|
||
-DWITH_USB_BACKEND=OFF -DWITH_SERIAL_BACKEND=OFF \
|
||
-DWITH_XML_BACKEND=OFF -DHAVE_DNS_SD=OFF \
|
||
-DWITH_TESTS=OFF -DWITH_EXAMPLES=OFF -DWITH_DOC=OFF \
|
||
-DCSHARP_BINDINGS=OFF -DPYTHON_BINDINGS=OFF \
|
||
-DWITH_IIOD=OFF -DWITH_LOCAL_CONFIG=OFF -DWITH_ZSTD=OFF \
|
||
-DTHREADS_PREFER_PTHREAD_FLAG=ON
|
||
cmake --build build-armhf -j"$(nproc)"
|
||
cmake --install build-armhf
|
||
cd "$WORK"
|
||
# Если cmake ругается на libxml2: XML backend в этой версии отключается
|
||
# флагом выше; если версия libiio его требует — собери libxml2 static
|
||
# (--without-python --without-zlib --without-lzma) в $XARM и повтори.
|
||
else
|
||
echo "уже собран, пропускаю"
|
||
fi
|
||
|
||
echo "=== [4/5] libad9361-iio (static, FIR для sample rate < 2.083 MSPS) ==="
|
||
# AD9361 без FIR не принимает rate ниже ~2.083 MSPS (EINVAL). Наш rate 1.92 MSPS
|
||
# требует загрузки FIR, что делает ad9361_set_bb_rate() из этой библиотеки.
|
||
if [ ! -f "$XARM/lib/libad9361.a" ]; then
|
||
[ -d libad9361-iio ] || git clone --depth 1 \
|
||
https://github.com/analogdevicesinc/libad9361-iio.git
|
||
cd libad9361-iio
|
||
|
||
# Тот же обход кросс-проблемы FindThreads, что и для libiio выше
|
||
sed -i '/find_package(Threads/c\set(Threads_FOUND ON)\nset(CMAKE_THREAD_LIBS_INIT "-lpthread")\nset(CMAKE_HAVE_PTHREADS_CREATE ON)\nadd_library(Threads::Threads INTERFACE IMPORTED)\nset_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES "-lpthread")' CMakeLists.txt || true
|
||
|
||
cat > toolchain-armhf.cmake <<EOF
|
||
set(CMAKE_SYSTEM_NAME Linux)
|
||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||
set(CMAKE_C_COMPILER ${CROSS}gcc)
|
||
set(CMAKE_C_FLAGS_INIT "$XCFLAGS")
|
||
set(CMAKE_FIND_ROOT_PATH $XARM)
|
||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||
EOF
|
||
cmake -B build-armhf -DCMAKE_TOOLCHAIN_FILE=toolchain-armhf.cmake \
|
||
-DCMAKE_INSTALL_PREFIX="$XARM" -DCMAKE_BUILD_TYPE=Release \
|
||
-DBUILD_SHARED_LIBS=OFF -DCMAKE_PREFIX_PATH="$XARM"
|
||
cmake --build build-armhf -j"$(nproc)"
|
||
cmake --install build-armhf
|
||
cd "$WORK"
|
||
else
|
||
echo "уже собран, пропускаю"
|
||
fi
|
||
|
||
echo "=== [5/5] Итог ==="
|
||
ls -la "$XARM/lib/" | grep -E "libfftw3f|libliquid|libiio|libad9361" || true
|
||
echo "Готово. Дальше: make check-env && make" |