Files
openipc-builder/builder.sh
T
25ed956610 build-one: add firmware_ref input for cross-repo bisect (#94)
When investigating a regression that lives in OpenIPC/firmware (or its
referenced packages like hisilicon-opensdk) but only manifests in a
builder build, you previously had to either roll firmware master back
or fork builder.sh manually. Adds a clean way:

  gh workflow run build-one.yml -f platform=hi3516ev200_fpv \
                                -f firmware_ref=<sha-or-tag-or-branch>

The workflow exports OPENIPC_FW_REV as env, which builder.sh now
honours: when set, it does a full clone (not --depth=1) and checks
out the requested ref before invoking the firmware build. When unset,
behaviour is unchanged (shallow clone of master HEAD).

Immediate motivation: bisect the +180 KB rootfs growth in
hi3516ev200_fpv between 2026-05-08 (5016 KB) and 2026-05-24 (5196 KB,
76 KB over partition limit). Per kaeru
'hi3516ev200-ev300-fpv-rootfs-size-overflow-2026-05-24'. Suspect is
recent hisilicon-opensdk bumps that brought in source-built sensor
drivers for ev200; bisect across firmware commits varying
HISILICON_OPENSDK_VERSION will pinpoint which bump pushed us past
the 5120 KB limit.

Generally useful long after this specific incident:
- Reproducing user-reported regressions at a specific firmware tag.
- Locking builds to a known-good firmware revision when builder is
  ahead of firmware.
- Future cross-repo bisects of any kind.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 09:31:21 +03:00

159 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
#
# OpenIPC | version 2023.11.30
# Autoupdate BUILDER repo
# Remove old building folder (for full rebuild)
# Download OpenIPC repo
# Copy files from Device Overlay
# Build Firmware
# Copy Kernel and Rootfs to Archive
# Copy Kernel and Rootfs to TFTP server
DEVICE="$1"
BUILDER_DIR=$(pwd)
FIRMWARE_DIR="${BUILDER_DIR}/openipc"
TIMESTAMP=$(date +"%Y%m%d%H%M")
VERSION=$(stat -c"%Y" $0)
echo_c() {
# 30 grey, 31 red, 32 green, 33 yellow, 34 blue, 35 magenta, 36 cyan, 37 white
t="\e[1;$1m$2\e[0m" || t="$2"
echo -e "$t"
}
autoup_rootfs() {
DT=$(date +"%y.%m.%d")
OPENIPC_VER=$(echo OpenIPC v${DT:0:1}.${DT:1})
SOC=$(echo ${DEVICE} | cut -d_ -f1)
echo_c 34 "\nDownloading u-boot created by OpenIPC"
curl --location --output ./output/images/u-boot-${SOC}-universal.bin \
https://github.com/OpenIPC/firmware/releases/download/latest/u-boot-${SOC}-universal.bin
echo_c 34 "\nMaking autoupdate u-boot image"
./output/host/bin/mkimage -A arm -O linux -T firmware -n "$OPENIPC_VER" \
-a 0x0 -e 0x50000 -d ./output/images/u-boot-${SOC}-universal.bin \
./output/images/autoupdate-uboot.img
echo_c 34 "\nMaking autoupdate kernel image"
./output/host/bin/mkimage -A arm -O linux -T kernel -C none -n "$OPENIPC_VER" \
-a 0x50000 -e 0x250000 -d ./output/images/uImage.${SOC} \
./output/images/autoupdate-kernel.img
echo_c 34 "\nMaking autoupdate rootfs image"
./output/host/bin/mkimage -A arm -O linux -T filesystem -n "$OPENIPC_VER" \
-a 0x250000 -e 0x750000 -d ./output/images/rootfs.squashfs.${SOC} \
./output/images/autoupdate-rootfs.img
}
copy_to_archive() {
echo_c 32 "Copying files to local archive"
mkdir -p "${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}"
cp -a \
${FIRMWARE_DIR}/output/images/rootfs.squashfs.* \
${FIRMWARE_DIR}/output/images/uImage.* \
${FIRMWARE_DIR}/output/images/*.tar \
${FIRMWARE_DIR}/output/images/openipc.*.tgz \
${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}
if [ -f "${FIRMWARE_DIR}/output/images/autoupdate-kernel.img" ]; then
cp -a ${FIRMWARE_DIR}/output/images/autoupdate* ${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}
fi
echo_c 35 "\nAssembled firmware available in:"
tree -C "${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}"
if $(echo ${DEVICE} | grep -q hi3518ev200_lite); then
autoup_rootfs
fi
}
copy_to_tftp() {
echo_c 32 "\nCopying files to a TFTP server using SCP protocol"
scp -r \
${FIRMWARE_DIR}/output/images/rootfs.squashfs.* \
${FIRMWARE_DIR}/output/images/uImage.* \
${FIRMWARE_DIR}/output/images/openipc.*.tgz \
${TFTP_STORAGE}
if [ -f "${FIRMWARE_DIR}/output/images/autoupdate-kernel.img" ]; then
scp -r ${FIRMWARE_DIR}/output/images/autoupdate* ${TFTP_STORAGE}
fi
}
select_device() {
AVAILABLE_DEVICES=$(find devices -name *_defconfig | sort | cut -d/ -f5)
cmd="whiptail --title \"Available devices\" --menu \"Please select a device from the list below:\" 20 70 12"
for p in ${AVAILABLE_DEVICES//_defconfig}; do cmd="${cmd} \"$p\" \"\""; done
DEVICE=$(eval "${cmd} 3>&1 1>&2 2>&3")
if [ $? != 0 ]; then
echo_c 31 "Cancelled."
exit 1
fi
}
copy_extra_packages() {
extra_package=${BUILDER_DIR}/package
firmware_package=${FIRMWARE_DIR}/general/package
cp -afv $extra_package/* $firmware_package
package_list_file=$firmware_package/Config.in
for f in "$extra_package"/*
do
package_name=$(basename $f)
if ! grep -Fq "$package_name" $package_list_file
then
printf 'source "$BR2_EXTERNAL_GENERAL_PATH/package/%s/Config.in"\n' $package_name >> $package_list_file
fi
done
}
echo_c 37 "Experimental system for building OpenIPC firmware for known devices"
echo_c 30 "https://openipc.org/"
echo_c 30 "Version: ${VERSION}"
while [ -z "${DEVICE}" ]; do select_device; done
echo_c 31 "\nStarting a device for ${DEVICE}"
ITEM=$(find devices -name ${DEVICE}_defconfig | cut -d/ -f1,2)
tree -C "${ITEM}"
sleep 3
echo_c 33 "\nUpdating Builder"
git pull
rm -rf openipc
# OPENIPC_FW_REV pins firmware to a specific ref (branch, tag, or SHA) for
# cross-repo bisect of size/regression issues — set by build-one.yml's
# firmware_ref input. When unset, clones HEAD of master as before.
if [ ! -d "$FIRMWARE_DIR" ]; then
if [ -n "$OPENIPC_FW_REV" ]; then
echo_c 33 "\nDownloading Firmware @ ${OPENIPC_FW_REV}"
git clone https://github.com/OpenIPC/firmware.git "$FIRMWARE_DIR"
git -C "$FIRMWARE_DIR" checkout "$OPENIPC_FW_REV"
else
echo_c 33 "\nDownloading Firmware"
git clone --depth=1 https://github.com/OpenIPC/firmware.git "$FIRMWARE_DIR"
fi
cd "$FIRMWARE_DIR"
else
echo_c 33 "\nUpdating Firmware"
cd "$FIRMWARE_DIR"
# git reset HEAD --hard
# git pull --rebase
fi
echo_c 33 "\nCopying extra packages"
copy_extra_packages
echo_c 33 "\nCopying device files"
cp -afv ${BUILDER_DIR}/${ITEM}/* ${FIRMWARE_DIR}
echo_c 33 "\nBuilding the device"
make BOARD=${DEVICE}
copy_to_archive
echo_c 35 "\nDone"
cd "$BUILDER_DIR"