WIP: chromebook integration script

I intend to merge every Chromebook that Mrchromebox supports,
into Libreboot, ready for the Libreboot 25.12 release. Work
is still ongoing, and several changes need to happen in lbmk.

I started working on it a few weeks ago (today is
14 November 2025 as I push this).

Still TODO:

* Automatically create lbmk coreboot targets, based
  on the configs present in MrChromebox git
* Re-work git repository management in lbmk, such that
  a list of upstreams is used, instead of a hardcoded
  list per configuration; this will allow us to use
  different remotes across the same project, even where
  they diverge. This would then allow us to use the
  MrChromebook repository directly, instead of cherry-picking
  patches into upstream coreboot
* The note above about remotes would also mean that we can
  use MrChromebox's own edk2 repository directly. All of this
  would reduce the burden on lbmk.git
* Support building edk2 payloads, exactly mirroring the
  setups used on MrChromebox builds

There are some things that need to be checked first, for
boards that use MMC-based or eMMC-based storage, for the
GRUB and SeaBIOS payloads, also U-Boot, because I will
also be using these.

As such, this current script shall sit in lbmk master, but
it is not yet finished.

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2025-10-11 16:27:47 +01:00
parent 25f523bbac
commit d7869a56f5
2 changed files with 132 additions and 1 deletions

130
include/chromebook.sh Normal file
View File

@@ -0,0 +1,130 @@
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2025 Leah Rowe <leah@libreboot.org>
# Import MrChromebox project into xbmk
# NOTE: variable naming scheme:
# mr_ for variables/functions dealing with MrChromebox
# mx_ for variables/functions pertaining to Libreboot setup
# because i am a non-binary blob
spdx="# SPDX-License-Identifier: GPL-3.0-or-later"
# temporary work variables
mr_tmpdir="" # dir to clone tmp repos in
# NOTE: upstream for our purposes: https://review.coreboot.org/coreboot
mr_cbrepo="https://github.com/mrchromebox/coreboot"
mr_cbbranch="MrChromebox-2503" # branch in mrchromebox
mr_cbrev="ecd9fa6a177e00132ec214252a2b9cebbb01e25f" # relative to base
mr_cbrevbase="38f5f7c48024d9fca4b6bbd88914423c34da709c" # 25.03 upstream base
mr_cbtree="chromebook" # tree name in xbmk
# NOTE: upstream for our purposes: https://github.com/tianocore/edk2.git
mr_edk2repo="https://github.com/mrchromebox/edk2"
mr_edk2branch="uefipayload_2502" # branch in mrchromebox
mr_edk2rev="feaf6b976b7cc72a18ed364f273751c943a9e7d0" # relative to base
mr_edk2revbase="fbe0805b2091393406952e84724188f8c1941837" # 2025.02 upstream
mr_edk2tree="chromebook" # tree name in xbmk
# mxlibreboot was here
prep_mr_import()
{
if [ -f "$xbmkpwd/CHANGELOG" ]; then
err "Project import disabled on releases" "prep_mr_import" "$@"
fi
mr_tmpdir="`mktemp -d || err "can't make mrtmpdir"`" || \
err "can't make mrtmpdir" "prep_mr_coreboot" "$@"
x_ remkdir "$mr_tmpdir"
x_ prep_mx_edk2conf
x_ prep_mr_projects
x_ rm -Rf "$mr_tmpdir"
}
# create config/git/edk2/pkg.cfg
prep_mx_edk2conf()
{
x_ remkdir "config/git/edk2"
x_ prep_mr_file "config/git/edk2/pkg.cfg" \
"$spdx" \
"" \
"rev=\"HEAD\"" \
"url=\"https://codeberg.org/libreboot/edk2\"" \
"bkup_url=\"https://git.disroot.org/libreboot/edk2\""
}
# prep config/PROJECT/TREE/ for various projects
prep_mr_projects()
{
x_ prep_mr "coreboot" "$mr_cbrepo" "$mr_cbbranch" "$mr_cbrev" \
"$mr_cbrevbase" "$mr_cbtree"
x_ prep_mr "edk2" "$mr_edk2repo" "$mr_edk2branch" "$mr_edk2rev" \
"$mr_edk2revbase" "$mr_edk2tree"
}
# create config/PROJECT/TREE/target.cfg
# and config/PROJECT/TREE/patches/
prep_mr()
{
mr_projectname="$1"
mr_repo="$2"
mr_branch="$3"
mr_rev="$4"
mr_revbase="$5"
mr_tree="$6"
x_ prep_mr_clone "$@"
x_ prep_mr_patch "$@"
x_ prep_mr_file "config/$1/$6/target.cfg" \
"$spdx" \
"" \
"tree=\"$6\"" \
"rev=\"$5\""
}
prep_mr_clone()
{
mr_tmpclone="$mr_tmpdir/$1"
x_ git clone "$2" "$mr_tmpclone"
x_ git -C "$mr_tmpclone" checkout "$3"
# we don't reset, because we format-patch between revbase..rev
}
prep_mr_patch()
{
mr_tmpclone="$mr_tmpdir/$1"
mx_patchdir="config/$1/$6/patches"
x_ remkdir "$mx_patchdir"
if [ "$4" != "$5" ]; then
x_ git -C "$mr_tmpclone" format-patch $5..$4
x_ mv "$mr_tmpclone"/*.patch "$mx_patchdir"
fi
# if no patches were created, rmdir will succeed
rmdir "$mx_patchdir" 1>/dev/null 2>/dev/null || :
}
prep_mr_file()
{
mr_filename="$1"
shift 1
x_ rm -f "$mr_filename"
while [ $# -gt 0 ]
do
printf "%s\n" "$1" >> "$mr_filename" || \
err "Can't write '$1' to '$mr_filename'" prep_mr_file "$@"
shift 1
done
printf "Created '%s'\n" "$mr_filename"
}