#!/usr/bin/env bash # Пересборка прошивок LibreVNA для radar_system. # # Дерево проекта лежит рядом: ./LibreVNA (апстрим v1.6.5 + доработки под master/slave). # # ./build.sh упаковать .vnafw из уже собранных .bin # -> результат побайтово совпадает с device_firmware/*.vnafw # ./build.sh --stm32 сначала пересобрать STM32 из исходников, потом упаковать # # FPGA-битстримы здесь НЕ собираются: нужна Xilinx ISE 14.7 в виртуалке (см. README.md). set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SRC="$HERE/LibreVNA" OUT="$HERE/out" REBUILD_STM32=0 [ "${1:-}" = "--stm32" ] && REBUILD_STM32=1 # Ищем рабочий Python 3. В PATH под Windows часто висит заглушка из Microsoft Store, # которая только печатает рекламу — поэтому каждого кандидата реально проверяем. find_python() { local c for c in "${PYTHON:-}" python3 python py \ "$HOME/AppData/Local/Programs/Python/Python312/python.exe" \ /c/Users/*/AppData/Local/Programs/Python/Python3*/python.exe \ /c/Python3*/python.exe; do [ -n "$c" ] || continue command -v "$c" >/dev/null 2>&1 || [ -x "$c" ] || continue if "$c" -c "import sys; sys.exit(0 if sys.version_info[0]==3 else 1)" >/dev/null 2>&1; then echo "$c"; return 0 fi done return 1 } PY="$(find_python)" || { echo "не найден рабочий Python 3 (задайте: PYTHON=/путь/python $0)"; exit 1; } mkdir -p "$OUT" cd "$SRC" if [ "$REBUILD_STM32" = "1" ]; then # Тулчейн из STM32CubeIDE 1.17.0 — именно им собраны эталонные .bin (gcc 12.3.1). # BINPATH обязателен: в Makefile по умолчанию стоит /usr/bin (Linux). CUBE="C:/ST/STM32CubeIDE_1.17.0/STM32CubeIDE/plugins" BINPATH="${BINPATH:-$CUBE/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.12.3.rel1.win32_1.1.0.202410251130/tools/bin}" MK="/c/ST/STM32CubeIDE_1.17.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.make.win32_2.2.0.202409170845/tools/bin" [ -d "$MK" ] && export PATH="$MK:$PATH" [ -e "$BINPATH/arm-none-eabi-gcc.exe" ] || [ -e "$BINPATH/arm-none-eabi-gcc" ] || { echo "не найден тулчейн: $BINPATH" echo "укажите свой: BINPATH=/путь/к/tools/bin $0 --stm32"; exit 1; } echo "==> STM32: мастер" make -C Software/VNA_embedded BINPATH="$BINPATH" -j4 >/dev/null echo "==> STM32: external LO slave" make -C Software/VNA_embedded BINPATH="$BINPATH" -j4 \ EXTERNAL_MASTER_LO_SLAVE=1 BUILD_DIR=build_external_lo_slave >/dev/null fi echo "==> упаковка combined.vnafw (мастер)" "$PY" AssembleFirmware.py \ --bitstream FPGA/VNA/top_master.bin \ --mcu Software/VNA_embedded/build/VNA_embedded.bin \ --output "$OUT/combined.vnafw" echo "==> упаковка combined_external_lo_slave.vnafw" "$PY" AssembleFirmware.py \ --bitstream FPGA/VNA/top_external_lo_slave.bin \ --mcu Software/VNA_embedded/build_external_lo_slave/VNA_embedded.bin \ --output "$OUT/combined_external_lo_slave.vnafw" echo echo "==> сверка с эталонами device_firmware/" ok=1 for f in combined.vnafw combined_external_lo_slave.vnafw; do a=$(sha256sum < "$OUT/$f" | cut -d' ' -f1) b=$(sha256sum < "$HERE/../$f" | cut -d' ' -f1) if [ "$a" = "$b" ]; then echo " $f: совпадает побайтово" else echo " $f: ОТЛИЧАЕТСЯ"; ok=0 fi done echo ls -l "$OUT" [ "$ok" = "1" ] || echo "ВНИМАНИЕ: расхождение — см. README.md, раздел «Что воспроизводится побайтово»"