diff --git a/.github/workflows/main_build.yml b/.github/workflows/main_build.yml index e83d2f8..1e3b0f5 100644 --- a/.github/workflows/main_build.yml +++ b/.github/workflows/main_build.yml @@ -57,13 +57,50 @@ jobs: id: detect env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Pass PR body as an env var to avoid embedding ${{ }} expressions + # inside the run: | block at column-0 (which terminates the YAML + # block scalar prematurely and causes a static YAML parse error). + PR_BODY: ${{ github.event.pull_request.body }} run: | - # Resolve explicit board list from workflow_dispatch input or repository_dispatch payload. + # ── Priority order for board selection ────────────────────────────── + # 1. workflow_dispatch input → explicit user choice + # 2. repository_dispatch payload → caller-specified list + # 3. pull_request event → parse "boards: " from PR body, + # fall back to default fast-CI set, + # or "all" to build every board + # 4. everything else (schedule, push) → auto-detect from HAOS repo + # ──────────────────────────────────────────────────────────────────── + + PR_DEFAULT_BOARDS="generic_aarch64,generic_x86_64,rpi4_64" + BOARDS_INPUT="${{ github.event.inputs.boards }}" + if [[ -z "${BOARDS_INPUT}" && "${{ github.event_name }}" == "repository_dispatch" ]]; then BOARDS_INPUT="${{ github.event.client_payload.boards }}" fi + if [[ -z "${BOARDS_INPUT}" && "${{ github.event_name }}" == "pull_request" ]]; then + # Extract "boards: " from the PR body (case-insensitive, first match). + # PR_BODY is injected via env: above to avoid YAML block-scalar issues. + BOARDS_INPUT=$(echo "${PR_BODY}" \ + | grep -iE '^[[:space:]]*boards[[:space:]]*:[[:space:]]*' \ + | head -1 \ + | sed -E 's/^[[:space:]]*boards[[:space:]]*:[[:space:]]*//i' \ + | tr -d '\r') + + if [[ -z "${BOARDS_INPUT}" ]]; then + # No "boards:" line in PR body — use the default fast-CI set. + BOARDS_INPUT="${PR_DEFAULT_BOARDS}" + echo "[INFO] PR body has no 'boards:' line — using default: ${BOARDS_INPUT}" + elif [[ "${BOARDS_INPUT,,}" == "all" ]]; then + # Explicit "all" — clear the input so the auto-detect path runs below. + BOARDS_INPUT="" + echo "[INFO] PR body specifies 'all' — detecting all boards from HAOS repo." + else + echo "[INFO] PR body specifies boards: ${BOARDS_INPUT}" + fi + fi + if [[ -n "${BOARDS_INPUT}" ]]; then # Convert comma-separated list to a sorted JSON array, stripping whitespace. BOARDS=$(echo "${BOARDS_INPUT}" \ @@ -409,9 +446,12 @@ jobs: if [[ -d "${RPI_MEDIA}/rp1-cfe" && -d "${RPI_MEDIA}/rp1_cfe" ]]; then echo "[INFO] Both rp1-cfe/ and rp1_cfe/ found — removing legacy rp1-cfe/" rm -rf "${RPI_MEDIA}/rp1-cfe" - # Drop the legacy entry from the parent Makefile to avoid dangling obj- lines. + # Drop the legacy entry from both Makefile (obj- line) and Kconfig + # (source line). olddefconfig reads Kconfig before any compilation, + # so both files must be cleaned up or it fails with "can't open file". sed -i '/rp1-cfe/d' "${RPI_MEDIA}/Makefile" || true - echo "[INFO] rp1-cfe/ removed successfully." + sed -i '/rp1-cfe/d' "${RPI_MEDIA}/Kconfig" || true + echo "[INFO] rp1-cfe/ removed and parent Makefile/Kconfig patched." else echo "[INFO] No rp1-cfe/rp1_cfe duplicate detected, nothing to do." fi @@ -483,6 +523,13 @@ jobs: fi echo "[INFO] Module build CROSS_COMPILE=${MODULE_CROSS_COMPILE}" + echo "[INFO] Running 'make modules_prepare' for kernel module build ..." + make -C "${LINUX_SRC}" \ + ARCH="${ARCH}" \ + CROSS_COMPILE="${MODULE_CROSS_COMPILE}" \ + modules_prepare \ + 2>&1 | tail -60 + echo "[INFO] Building base kernel modules ..." make -C "${LINUX_SRC}" \ ARCH="${ARCH}" \ @@ -559,6 +606,13 @@ jobs: esac [[ -x "${MODULE_CROSS_COMPILE}gcc" ]] || MODULE_CROSS_COMPILE="${CROSS_COMPILE}" + echo "[INFO] Running 'make modules_prepare' for QUIC module build ..." + make -C "${LINUX_SRC}" \ + ARCH="${ARCH}" \ + CROSS_COMPILE="${MODULE_CROSS_COMPILE}" \ + modules_prepare \ + 2>&1 | tail -60 + make -C "${LINUX_SRC}" \ ARCH="${ARCH}" \ KBUILD_MODPOST_WARN=1 \ @@ -593,11 +647,20 @@ jobs: exit 0 fi + # Resolve Buildroot cross-compiler for ZFS build. + OS_DIR="${GITHUB_WORKSPACE}/operating-system" + case "${ARCH}" in + arm64) MODULE_CROSS_COMPILE="${OS_DIR}/output/host/bin/aarch64-buildroot-linux-gnu-" ;; + x86) MODULE_CROSS_COMPILE="${OS_DIR}/output/host/bin/x86_64-buildroot-linux-gnu-" ;; + *) MODULE_CROSS_COMPILE="${CROSS_COMPILE}" ;; + esac + [[ -x "${MODULE_CROSS_COMPILE}gcc" ]] || MODULE_CROSS_COMPILE="${CROSS_COMPILE}" + # ZFS configure needs utsrelease.h from 'make prepare'. echo "[INFO] Running 'make prepare' for ZFS configure ..." make -C "${LINUX_SRC}" \ ARCH="${ARCH}" \ - CROSS_COMPILE="${CROSS_COMPILE}" \ + CROSS_COMPILE="${MODULE_CROSS_COMPILE}" \ prepare \ 2>&1 | tail -60 @@ -653,17 +716,16 @@ jobs: make -C "${LINUX_SRC}" \ ARCH="${ARCH}" \ - CROSS_COMPILE="${CROSS_COMPILE}" \ + CROSS_COMPILE="${MODULE_CROSS_COMPILE}" \ olddefconfig \ 2>&1 | tail -30 - OS_DIR="${GITHUB_WORKSPACE}/operating-system" - case "${ARCH}" in - arm64) MODULE_CROSS_COMPILE="${OS_DIR}/output/host/bin/aarch64-buildroot-linux-gnu-" ;; - x86) MODULE_CROSS_COMPILE="${OS_DIR}/output/host/bin/x86_64-buildroot-linux-gnu-" ;; - *) MODULE_CROSS_COMPILE="${CROSS_COMPILE}" ;; - esac - [[ -x "${MODULE_CROSS_COMPILE}gcc" ]] || MODULE_CROSS_COMPILE="${CROSS_COMPILE}" + echo "[INFO] Running 'make modules_prepare' for ZFS module build ..." + make -C "${LINUX_SRC}" \ + ARCH="${ARCH}" \ + CROSS_COMPILE="${MODULE_CROSS_COMPILE}" \ + modules_prepare \ + 2>&1 | tail -60 make -C "${LINUX_SRC}" \ ARCH="${ARCH}" \