143 lines
6.1 KiB
Bash
Executable File
143 lines
6.1 KiB
Bash
Executable File
#!/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" |