Files
Pluto-SDR/.gitea/workflows/04-cross-build.yml
Maxim a66cc4408b ci: 03-gftest и 04-cross-build на runs-on: armhf (cross-builder)
- 03-gftest: runs-on host → armhf; текст ошибки инструментов обобщён
  (build-essential вместо apk build-base)
- 04-cross-build: runs-on host → armhf; приёмка тулчейна остаётся
  реальной ARM-компиляцией + разбором e_machine

01-smoke/02-guardrails остаются на host (Alpine act_runner_tools) — не тронуты.
2026-07-15 13:12:52 +03:00

100 lines
4.4 KiB
YAML
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.

# 04-cross-build — проверочный workflow. Приёмочный тест ARM-тулчейна в
# образе cross-раннера (по аналогии с их 04-toolchain).
#
# Идёт на runs-on: armhf — отдельный НАТИВНЫЙ x86-64 Debian-runner с
# arm-linux-gnueabihf-gcc (x86-бинарь, выдающий ARM-код; НЕ эмуляция) и
# прекомпилированными статическими либами $XARM. "Файл лежит" и "command -v
# нашёл" ничего не доказывают (glibc-бинарь без ld-linux даёт обманчивый
# not found) — поэтому доказательство здесь одно: реальная кросс-компиляция
# крошечной программы + проверка машинного типа результата по ELF-заголовку
# (e_machine == EM_ARM), а затем настоящая сборка tx/rx/bench штатным make all.
name: 04-cross-build
on:
push:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
cross-build:
runs-on: armhf
timeout-minutes: 15
steps:
- name: Проверить кросс-тулчейн (реальная ARM-компиляция, не command -v)
run: |
if ! command -v arm-linux-gnueabihf-gcc >/dev/null 2>&1; then
echo "ОШИБКА: arm-linux-gnueabihf-gcc нет в образе cross-раннера (метка armhf)."
echo "Проверь runner-image/Dockerfile: пакет gcc-arm-linux-gnueabihf."
exit 1
fi
tmp=$(mktemp -d)
printf 'int main(void){return 0;}\n' > "$tmp/hello.c"
if ! arm-linux-gnueabihf-gcc -static -o "$tmp/hello" "$tmp/hello.c" 2>"$tmp/err.log"; then
echo "ОШИБКА: arm-linux-gnueabihf-gcc не смог собрать даже hello world."
echo "Типичная причина на Alpine/musl: сам gcc — glibc-бинарь без ld-linux."
cat "$tmp/err.log"
rm -rf "$tmp"
exit 1
fi
# e_machine — байты 18-19 ELF-заголовка (little-endian uint16).
# EM_ARM = 0x0028 → байты "28 00".
machine=$(od -An -tx1 -j 18 -N 2 "$tmp/hello" | tr -d ' \n')
if [ "$machine" != "2800" ]; then
echo "ОШИБКА: результат не ARM (e_machine=0x$machine, ожидали 0x0028)."
echo "Тулчейн собирает не под ту архитектуру — заведён неверный flavor образа."
rm -rf "$tmp"
exit 1
fi
echo "OK: arm-linux-gnueabihf-gcc реально собрал ARM-бинарь (e_machine=0x$machine)"
rm -rf "$tmp"
- name: Получить код репозитория
env:
REPO_TOKEN: ${{ github.token }}
run: |
rm -rf repo
git clone --quiet "http://x-access-token:${REPO_TOKEN}@localhost:3000/${GITHUB_REPOSITORY}.git" repo
git -C repo checkout --quiet "$GITHUB_SHA"
- name: make check-env ($XARM статические либы)
run: make -C repo check-env
- name: make all (transmitter, receiver, ofdm_bench под armhf)
run: |
make -C repo all 2>&1 | tee /tmp/build.log
echo ""
echo "=== Проверка архитектуры собранных бинарников ==="
for bin in transmitter receiver ofdm_bench; do
machine=$(od -An -tx1 -j 18 -N 2 "repo/build/$bin" | tr -d ' \n')
if [ "$machine" != "2800" ]; then
echo "ОШИБКА: repo/build/$bin не ARM (e_machine=0x$machine)"
exit 1
fi
echo " [OK] $bin — ARM-бинарь (e_machine=0x$machine)"
done
- name: Нет предупреждений компилятора (-Wall -Wextra уже в CFLAGS)
run: |
if grep -q "warning:" /tmp/build.log; then
echo "ОШИБКА: сборка прошла с предупреждениями:"
grep "warning:" /tmp/build.log
exit 1
fi
echo "OK: предупреждений нет"
- name: Убрать за собой
if: always()
run: rm -rf repo /tmp/build.log