Skip to content
86 changes: 74 additions & 12 deletions .github/workflows/main_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: <list>" 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: <value>" 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}" \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}" \
Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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}" \
Expand Down
Loading