отладка fec

This commit is contained in:
Maxim
2026-07-10 16:25:29 +03:00
parent 9eab1f32c4
commit 11bdfa3aa2
2 changed files with 55 additions and 33 deletions

View File

@@ -1,7 +1,7 @@
#!/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)
# Собирает: FFTW 3.3.10 (single+NEON), libfec (RS для liquid), liquid-dsp 1.8.0,
# libiio (local backend), libad9361-iio (FIR для rate < 2.083 MSPS)
# Запуск: scripts/build_deps.sh (один раз, ~15-20 мин на RPi4)
set -euo pipefail
source "$(dirname "$0")/../toolchain.env"
@@ -10,12 +10,12 @@ WORK="$HOME/src"
mkdir -p "$WORK" "$XARM"
cd "$WORK"
echo "=== [0/4] Проверка тулчейна ==="
echo "=== [0/6] Проверка тулчейна ==="
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) ==="
echo "=== [1/6] 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
@@ -31,33 +31,54 @@ 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; }
echo "=== [2/6] libfec (Reed-Solomon для liquid RS(255,223)) ==="
if [ ! -f "$XARM/lib/libfec.a" ]; then
[ -d libfec ] || git clone --depth 1 https://github.com/jgaeddert/libfec.git
cd libfec
[ -x ./configure ] || ./bootstrap.sh || autoreconf -i
# config.guess/config.sub 2007 года не знают aarch64 — берём свежие из системы
for f in config.guess config.sub; do
cp -f "/usr/share/automake-1.16/$f" "$f" 2>/dev/null || \
cp -f "/usr/share/misc/$f" "$f" 2>/dev/null || true
done
./configure --build="$(gcc -dumpmachine)" --host=arm-linux-gnueabihf \
--prefix="$XARM" CC="$CC" CFLAGS="$XCFLAGS"
make -j"$(nproc)" && make install
cd "$WORK"
else
echo "уже собран, пропускаю"
fi
echo "=== [3/5] libiio v0.25 (static, только local backend) ==="
echo "=== [3/6] liquid-dsp 1.8.0 (static, с FFTW+libfec) ==="
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
[ -f makefile ] && make clean || true
./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
grep -q "HAVE_LIBFFTW3F 1" config.log || {
echo "ОШИБКА: liquid не нашёл кросс-FFTW — проверь \$XARM"; exit 1; }
grep -q "HAVE_LIBFEC 1" config.log || {
echo "ОШИБКА: liquid не нашёл libfec — RS будет недоступен"; exit 1; }
make -j"$(nproc)" && make install
cd "$WORK"
else
echo "уже собран, пропускаю (rm \$XARM/lib/libliquid.a чтобы пересобрать с libfec)"
fi
echo "=== [4/6] 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
@@ -80,23 +101,21 @@ EOF
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() из этой библиотеки.
echo "=== [5/6] libad9361-iio (static, FIR для sample rate < 2.083 MSPS) ==="
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
# ХАК: Вырезаем тесты, которые валятся на линковке в GCC 14
sed -i 's|add_subdirectory(test)|#&|' CMakeLists.txt || true
cat > toolchain-armhf.cmake <<EOF
set(CMAKE_SYSTEM_NAME Linux)
@@ -108,6 +127,7 @@ 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
# Убран нерабочий -DCMAKE_EXE_LINKER_FLAGS="-lm"
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"
@@ -118,6 +138,6 @@ else
echo "уже собран, пропускаю"
fi
echo "=== [5/5] Итог ==="
ls -la "$XARM/lib/" | grep -E "libfftw3f|libliquid|libiio|libad9361" || true
echo "=== [6/6] Итог ==="
ls -la "$XARM/lib/" | grep -E "libfftw3f|libfec|libliquid|libiio|libad9361" || true
echo "Готово. Дальше: make check-env && make"