Skip to content

Commit ccbf28e

Browse files
Create build-rockchip-driver-debs.yml
1 parent adf4b24 commit ccbf28e

1 file changed

Lines changed: 284 additions & 0 deletions

File tree

Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
name: Build Rockchip Driver Packages
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
targets:
7+
description: Comma-separated OpenHD-ImageBuilder targets
8+
required: false
9+
default: radxa-rock3a_base,rock5a_base,rock5b_base,radxa-cm3,radxa-zero3w_base,core3566
10+
push:
11+
paths:
12+
- ".github/workflows/build-rockchip-driver-debs.yml"
13+
- "**"
14+
pull_request:
15+
paths:
16+
- ".github/workflows/build-rockchip-driver-debs.yml"
17+
- "**"
18+
19+
jobs:
20+
resolve-targets:
21+
runs-on: ubuntu-22.04
22+
outputs:
23+
targets: ${{ steps.targets.outputs.targets }}
24+
steps:
25+
- id: targets
26+
shell: bash
27+
run: |
28+
targets="${{ github.event.inputs.targets || 'radxa-rock3a_base,rock5a_base,rock5b_base,radxa-cm3,radxa-zero3w_base,core3566' }}"
29+
json="$(printf '%s' "$targets" | jq -Rc 'split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))')"
30+
echo "targets=${json}" >> "$GITHUB_OUTPUT"
31+
32+
build:
33+
name: Build ${{ matrix.target }}
34+
needs: resolve-targets
35+
runs-on: ubuntu-22.04
36+
timeout-minutes: 360
37+
strategy:
38+
fail-fast: false
39+
matrix:
40+
target: ${{ fromJson(needs.resolve-targets.outputs.targets) }}
41+
42+
steps:
43+
- name: Checkout driver
44+
uses: actions/checkout@v4
45+
with:
46+
path: driver
47+
48+
- name: Checkout OpenHD ImageBuilder
49+
uses: actions/checkout@v4
50+
with:
51+
repository: OpenHD/OpenHD-ImageBuilder
52+
path: imagebuilder
53+
54+
- name: Cache base image archive
55+
uses: actions/cache@v4
56+
with:
57+
path: work/${{ matrix.target }}/*.img.xz
58+
key: rockchip-base-${{ matrix.target }}-${{ hashFiles('imagebuilder/images/**') }}
59+
restore-keys: |
60+
rockchip-base-${{ matrix.target }}-
61+
62+
- name: Build deb package
63+
shell: bash
64+
env:
65+
TARGET: ${{ matrix.target }}
66+
run: |
67+
set -euo pipefail
68+
69+
case "${GITHUB_REPOSITORY##*/}" in
70+
rtl8812au)
71+
DRIVER_PACKAGE="rtl8812au"
72+
MODULE_NAME="88XXau_ohd"
73+
USER_MODULE_NAME_VALUE="88XXau"
74+
;;
75+
rtl88x2bu)
76+
DRIVER_PACKAGE="rtl88x2bu"
77+
MODULE_NAME="88x2bu_ohd"
78+
USER_MODULE_NAME_VALUE="88x2bu"
79+
;;
80+
rtl88x2cu)
81+
DRIVER_PACKAGE="rtl88x2cu"
82+
MODULE_NAME="88x2cu_ohd"
83+
USER_MODULE_NAME_VALUE=""
84+
;;
85+
rtl88x2eu)
86+
DRIVER_PACKAGE="rtl88x2eu"
87+
MODULE_NAME="rtl88x2eu_ohd"
88+
USER_MODULE_NAME_VALUE="rtl88x2eu_ohd"
89+
;;
90+
*)
91+
echo "Unsupported driver repo: ${GITHUB_REPOSITORY}" >&2
92+
exit 1
93+
;;
94+
esac
95+
96+
sudo apt-get update
97+
sudo apt-get install -y --no-install-recommends \
98+
ca-certificates curl xz-utils parted e2fsprogs util-linux rsync \
99+
qemu-user-static binfmt-support file
100+
101+
CONFIG="imagebuilder/images/${TARGET}"
102+
if [[ ! -f "${CONFIG}" ]]; then
103+
echo "No OpenHD-ImageBuilder config for target ${TARGET}" >&2
104+
exit 1
105+
fi
106+
107+
# shellcheck disable=SC1090
108+
source "${CONFIG}"
109+
clean_value() { printf '%s' "${1:-}" | tr -d '\r'; }
110+
BASE_IMAGE_URL="$(clean_value "${BASE_IMAGE_URL}")"
111+
BASE_IMAGE="$(clean_value "${BASE_IMAGE}")"
112+
BASE_IMAGE_SHA256="$(clean_value "${BASE_IMAGE_SHA256:-}")"
113+
BASE_IMAGE_SHA512="$(clean_value "${BASE_IMAGE_SHA512:-}")"
114+
OS="$(clean_value "${OS}")"
115+
DISTRO="$(clean_value "${DISTRO}")"
116+
ROOT_PART="$(clean_value "${ROOT_PART}")"
117+
HAVE_CONF_PART="$(clean_value "${HAVE_CONF_PART:-false}")"
118+
CONF_PART="$(clean_value "${CONF_PART:-}")"
119+
120+
WORK_DIR="${GITHUB_WORKSPACE}/work/${TARGET}"
121+
OUT_DIR="${GITHUB_WORKSPACE}/out/${TARGET}"
122+
MNT_DIR="${WORK_DIR}/mnt"
123+
mkdir -p "${WORK_DIR}" "${OUT_DIR}" "${MNT_DIR}"
124+
125+
archive="${WORK_DIR}/${BASE_IMAGE}"
126+
image="${WORK_DIR}/${BASE_IMAGE%.xz}"
127+
if [[ ! -f "${archive}" ]]; then
128+
separator="/"
129+
[[ "${BASE_IMAGE_URL}" == */ ]] && separator=""
130+
curl -L --fail --retry 3 -o "${archive}" "${BASE_IMAGE_URL}${separator}${BASE_IMAGE}"
131+
fi
132+
[[ -n "${BASE_IMAGE_SHA256}" ]] && echo "${BASE_IMAGE_SHA256} ${archive}" | sha256sum -c -
133+
[[ -n "${BASE_IMAGE_SHA512}" ]] && echo "${BASE_IMAGE_SHA512} ${archive}" | sha512sum -c -
134+
[[ -f "${image}" ]] || xz -dk "${archive}"
135+
136+
partition_field() {
137+
local part="$1"
138+
local field="$2"
139+
sudo parted -s "${image}" unit b print | awk -v p="${part}" -v f="${field}" '$1 == p {gsub(/B/, "", $f); print $f}'
140+
}
141+
142+
cleanup() {
143+
sudo sync || true
144+
sudo mountpoint -q "${MNT_DIR}/etc/resolv.conf" && sudo umount -l "${MNT_DIR}/etc/resolv.conf" || true
145+
sudo mountpoint -q "${MNT_DIR}/sys" && sudo umount -l "${MNT_DIR}/sys" || true
146+
sudo mountpoint -q "${MNT_DIR}/dev/pts" && sudo umount -l "${MNT_DIR}/dev/pts" || true
147+
sudo mountpoint -q "${MNT_DIR}/dev" && sudo umount -l "${MNT_DIR}/dev" || true
148+
sudo mountpoint -q "${MNT_DIR}/proc" && sudo umount -l "${MNT_DIR}/proc" || true
149+
sudo mountpoint -q "${MNT_DIR}/conf" && sudo umount -l "${MNT_DIR}/conf" || true
150+
sudo mountpoint -q "${MNT_DIR}" && sudo umount -l "${MNT_DIR}" || true
151+
}
152+
trap cleanup EXIT
153+
154+
root_offset="$(partition_field "${ROOT_PART}" 2)"
155+
root_size="$(partition_field "${ROOT_PART}" 4)"
156+
sudo mount -o "loop,offset=${root_offset},sizelimit=${root_size},rw" "${image}" "${MNT_DIR}"
157+
158+
if [[ "${HAVE_CONF_PART}" == "true" && -n "${CONF_PART}" ]]; then
159+
conf_offset="$(partition_field "${CONF_PART}" 2)"
160+
conf_size="$(partition_field "${CONF_PART}" 4)"
161+
sudo mkdir -p "${MNT_DIR}/conf"
162+
sudo mount -o "loop,offset=${conf_offset},sizelimit=${conf_size},rw" "${image}" "${MNT_DIR}/conf"
163+
fi
164+
165+
sudo mkdir -p "${MNT_DIR}/opt/openhd-driver-build/src" "${MNT_DIR}/opt/openhd-driver-build/out"
166+
sudo rsync -a --delete --exclude='.git' --exclude='.github' --exclude='*.o' --exclude='*.ko' \
167+
--exclude='*.mod' --exclude='*.mod.c' --exclude='Module.symvers' --exclude='modules.order' \
168+
driver/ "${MNT_DIR}/opt/openhd-driver-build/src/"
169+
sudo cp /usr/bin/qemu-aarch64-static "${MNT_DIR}/usr/bin/" || true
170+
171+
sudo tee "${MNT_DIR}/opt/openhd-driver-build/build.sh" >/dev/null <<'CHROOT_SCRIPT'
172+
#!/usr/bin/env bash
173+
set -euo pipefail
174+
175+
: "${TARGET:?}"
176+
: "${OS:?}"
177+
: "${DISTRO:?}"
178+
: "${DRIVER_PACKAGE:?}"
179+
: "${MODULE_NAME:?}"
180+
: "${USER_MODULE_NAME_VALUE:=}"
181+
182+
SRC_DIR="/opt/openhd-driver-build/src"
183+
OUT_DIR="/opt/openhd-driver-build/out"
184+
short_sha="${GITHUB_SHA:-local}"
185+
short_sha="${short_sha:0:7}"
186+
VERSION="2.6.openhd.${GITHUB_RUN_NUMBER:-0}.${short_sha}"
187+
DEB_TARGET="$(echo "${TARGET}" | tr '[:upper:]_' '[:lower:]-' | sed -E 's/[^a-z0-9+.-]+/-/g')"
188+
189+
export DEBIAN_FRONTEND=noninteractive
190+
191+
apt_update_tolerant() {
192+
apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Retries=2 \
193+
-o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 update
194+
}
195+
196+
if [[ "${DISTRO}" == "bullseye" ]]; then
197+
sed -i -E \
198+
-e 's|https?://deb\.debian\.org/debian|http://archive.debian.org/debian|g' \
199+
-e '/bullseye-backports/s/^[[:space:]]*deb/# &/' \
200+
/etc/apt/sources.list 2>/dev/null || true
201+
find /etc/apt/sources.list.d -name '*.list' -print0 2>/dev/null \
202+
| xargs -0 -r sed -i -E \
203+
-e 's|https?://deb\.debian\.org/debian|http://archive.debian.org/debian|g' \
204+
-e '/bullseye-backports/s/^[[:space:]]*deb/# &/' || true
205+
fi
206+
207+
apt_update_tolerant
208+
apt-get install -y --no-install-recommends build-essential make gcc bc bison flex kmod dkms ca-certificates
209+
210+
ensure_headers() {
211+
local kver="$1"
212+
[[ -e "/lib/modules/${kver}/build/Makefile" ]] && return 0
213+
apt-get install -y --no-install-recommends "linux-headers-${kver}" || true
214+
if [[ ! -e "/lib/modules/${kver}/build/Makefile" ]]; then
215+
header_dir="$(find /usr/src -maxdepth 1 -type d \( -name "linux-headers-${kver}" -o -name "*${kver}*" \) | head -n1 || true)"
216+
[[ -n "${header_dir}" ]] && ln -sfn "${header_dir}" "/lib/modules/${kver}/build"
217+
fi
218+
[[ -e "/lib/modules/${kver}/build/Makefile" ]]
219+
}
220+
221+
package_driver() {
222+
local kver="$1"
223+
local ko="$2"
224+
local package_name="${DRIVER_PACKAGE}-${DEB_TARGET}-${kver}"
225+
package_name="$(echo "${package_name}" | tr '[:upper:]_' '[:lower:]-' | sed -E 's/[^a-z0-9+.-]+/-/g')"
226+
local pkg_dir="/opt/openhd-driver-build/pkg/${package_name}"
227+
rm -rf "${pkg_dir}"
228+
mkdir -p "${pkg_dir}/DEBIAN" "${pkg_dir}/lib/modules/${kver}/kernel/drivers/net/wireless"
229+
install -m 0644 "${ko}" "${pkg_dir}/lib/modules/${kver}/kernel/drivers/net/wireless/${MODULE_NAME}.ko"
230+
cat > "${pkg_dir}/DEBIAN/control" <<EOF
231+
Package: ${package_name}
232+
Version: ${VERSION}
233+
Section: kernel
234+
Priority: optional
235+
Architecture: arm64
236+
Maintainer: OpenHD <maintainers@openhd.org>
237+
Depends: kmod
238+
Description: OpenHD ${DRIVER_PACKAGE} kernel module for ${TARGET} ${kver}
239+
Built by GitHub Actions from ${GITHUB_REPOSITORY:-local}.
240+
EOF
241+
cat > "${pkg_dir}/DEBIAN/postinst" <<EOF
242+
#!/bin/sh
243+
set -e
244+
depmod -a ${kver} || true
245+
exit 0
246+
EOF
247+
chmod 0755 "${pkg_dir}/DEBIAN/postinst"
248+
dpkg-deb --build "${pkg_dir}" "${OUT_DIR}/${package_name}_${VERSION}_arm64.deb"
249+
}
250+
251+
mapfile -t kernels < <(find /lib/modules -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
252+
[[ "${#kernels[@]}" -gt 0 ]]
253+
for kver in "${kernels[@]}"; do
254+
ensure_headers "${kver}"
255+
make -C "${SRC_DIR}" clean || true
256+
make_args=(-C "${SRC_DIR}" -j"$(nproc)" ARCH=arm64 KVER="${kver}" KSRC="/lib/modules/${kver}/build")
257+
[[ -n "${USER_MODULE_NAME_VALUE}" ]] && make_args+=(USER_MODULE_NAME="${USER_MODULE_NAME_VALUE}")
258+
make "${make_args[@]}" modules
259+
ko="${SRC_DIR}/${MODULE_NAME}.ko"
260+
[[ -f "${ko}" ]] || ko="$(find "${SRC_DIR}" -maxdepth 1 -name '*.ko' | head -n1)"
261+
package_driver "${kver}" "${ko}"
262+
done
263+
CHROOT_SCRIPT
264+
265+
sudo chmod 0755 "${MNT_DIR}/opt/openhd-driver-build/build.sh"
266+
sudo mount -t proc proc "${MNT_DIR}/proc"
267+
sudo mount --bind /dev "${MNT_DIR}/dev"
268+
sudo mount --bind /dev/pts "${MNT_DIR}/dev/pts"
269+
sudo mount --bind /sys "${MNT_DIR}/sys"
270+
sudo rm -f "${MNT_DIR}/etc/resolv.conf"
271+
sudo touch "${MNT_DIR}/etc/resolv.conf"
272+
sudo mount --bind /etc/resolv.conf "${MNT_DIR}/etc/resolv.conf"
273+
274+
sudo --preserve-env=TARGET,OS,DISTRO,DRIVER_PACKAGE,MODULE_NAME,USER_MODULE_NAME_VALUE,GITHUB_SHA,GITHUB_RUN_NUMBER,GITHUB_REPOSITORY \
275+
chroot "${MNT_DIR}" /usr/bin/qemu-aarch64-static /bin/bash /opt/openhd-driver-build/build.sh
276+
277+
sudo cp -v "${MNT_DIR}"/opt/openhd-driver-build/out/*.deb "${OUT_DIR}/"
278+
279+
- name: Upload deb packages
280+
uses: actions/upload-artifact@v4
281+
with:
282+
name: ${{ github.event.repository.name }}-${{ matrix.target }}-debs
283+
path: out/${{ matrix.target }}/*.deb
284+
if-no-files-found: error

0 commit comments

Comments
 (0)