Files
Pluto-SDR/scripts/build_deps.sh
2026-07-10 16:25:29 +03:00

143 lines
6.1 KiB
Bash
Executable File
Raw 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.

#!/usr/bin/env bash
# build_deps.sh — кросс-сборка статических armhf-зависимостей в $XARM
# Собирает: 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"
WORK="$HOME/src"
mkdir -p "$WORK" "$XARM"
cd "$WORK"
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/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
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/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/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
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"
else
echo "уже собран, пропускаю"
fi
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
# Хак для потоков
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)
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
# Убран нерабочий -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"
cmake --build build-armhf -j"$(nproc)"
cmake --install build-armhf
cd "$WORK"
else
echo "уже собран, пропускаю"
fi
echo "=== [6/6] Итог ==="
ls -la "$XARM/lib/" | grep -E "libfftw3f|libfec|libliquid|libiio|libad9361" || true
echo "Готово. Дальше: make check-env && make"