trees: support -d (dry run) for custom build logic

-d does the same as -b, except for actually building
anything! in effect, it does the same as -f (fetch)
except that the resulting variable assignments will
not be recursive (as with -f).

if -d is passed, configuration is still loaded, defconfig
files are still cycled through, and more importantly:

helper functions are still processed.

the grub, serprog and coreboot helper functions have
been modified to return early (zero status) if -d is
passed.

example usage:

./update trees -d coreboot x230_12mb

this would download the files, NOT build coreboot, and
NOT build the payloads.

there is one additional benefit to doing it this way:

the utils command has been removed, e.g.
./update trees -b coreboot utils default

the equivalent is now:
./update trees -d coreboot default

the overall effect of this change is that the trees script
no longer contains any project-specific logic, except for
the crossgcc build logic.

it does include some config/data mkhelper files at the top,
for serprog and coreboot, so that those variables defined in
those files can be global, but another solution to mitigate
that will also be implemented in a future commit.

the purpose of this and other revisions (in the final push
to complete lbmk audit 6 / cbmk audit 2) is to generalise as
much logic as possible, removing various ugly hacks.

Signed-off-by: Leah Rowe <leah@libreboot.org>
audit2
Leah Rowe 2024-07-09 01:31:25 +01:00 committed by Leah Rowe
parent 2dad7b0b6f
commit 4dbce8aef0
3 changed files with 67 additions and 45 deletions

View File

@ -9,5 +9,6 @@ v="$v displaymode tmprom"
eval `setvars "n" $pv`
eval `setvars "" $v`
premake="mkvendorfiles"
mkhelper="mkcorebootbin"
postmake="mkcoreboottar"

View File

@ -8,6 +8,7 @@
mkserprog()
{
[ "$_f" = "-d" ] && return 0 # dry run
basename -as .h "$serdir/"*.h > "$TMPDIR/ser" || $err "!mk $1 $TMPDIR"
while read -r sertarget; do
@ -25,6 +26,7 @@ mkserprog()
mkpayload_grub()
{
[ "$_f" = "-d" ] && return 0 # dry run
eval `setvars "" grub_modules grub_install_modules`
eval `setcfg "$grubdata/module/$tree"`
@ -40,8 +42,33 @@ mkpayload_grub()
$err "$tree: cannot build grub.elf"; return 0
}
check_coreboot_utils()
{
for util in cbfstool ifdtool; do
utilelfdir="elf/$util/$1"
utilsrcdir="src/coreboot/$1/util/$util"
utilmode="" && [ -n "$mode" ] && utilmode="clean"
x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs
[ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ] && \
x_ mkdir -p "$utilelfdir" && \
x_ cp "$utilsrcdir/$util" "elf/$util/$1"
[ -z "$mode" ] || x_ rm -Rf "$utilelfdir"; continue
done; return 0
}
mkvendorfiles()
{
if [ "$_f" = "-d" ]; then
check_coreboot_utils "$tree"
elif [ "$_f" = "-b" ]; then
printf "%s\n" "${version%%-*}" > "$cdir/.coreboot-version"
fi
}
mkcorebootbin()
{
[ "$_f" = "-d" ] && return 0 # dry run
[ "$target" = "$tree" ] && return 0
tmprom="$cdir/build/coreboot.rom"
@ -64,7 +91,7 @@ mkcorebootbin()
[ "$payload_memtest" = "y" ] || payload_memtest="n"
[ "$(uname -m)" = "x86_64" ] || payload_memtest="n"
x_ ./update trees -b coreboot utils $tree
x_ ./update trees -d coreboot $tree
[ "$payload_seabios" = "y" ] && pname="seabios" && add_seabios
[ "$payload_uboot" = "y" ] && pname="uboot" && add_uboot
@ -113,6 +140,7 @@ add_uboot()
mkcoreboottar()
{
[ "$_f" = "-d" ] && return 0 # dry run
[ "$target" = "$tree" ] && return 0; [ "$XBMK_RELEASE" = "y" ] && \
[ "$release" != "n" ] && mkrom_tarball "bin/$target"; return 0
}

View File

@ -14,16 +14,17 @@ set -u -e
. "config/data/coreboot/mkhelper.cfg"
eval `setvars "" xarch cdir defconfig cmakedir xlang mode makeargs elfdir cmd \
project target target_dir targets xtree _f target1 bootstrapargs mkhelper \
project target target_dir targets xtree _f release bootstrapargs mkhelper \
autoconfargs listfile autogenargs btype tree rev tree_depend build_depend \
premake release postmake`
premake postmake`
main()
{
while getopts f:b:m:u:c:x:s:l:n: option; do
while getopts f:b:m:u:c:x:s:l:n:d: option; do
[ -n "$_f" ] && $err "only one flag is permitted"
_f="$1"
case "$1" in
-d) mode="" ;;
-b) mode="" ;;
-u) mode="oldconfig" ;;
-m) mode="menuconfig" ;;
@ -58,10 +59,9 @@ main()
cmd="build_targets" && singletree "$project" && cmd="build_project"
$cmd $@
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0
[ -f "$listfile" ] || return 0
[ -z "$mode" ] && printf "\n\nOK! Check %s/\n\n" "$elfdir"; return 0
[ -z "$mode" ] && [ "$_f" = "-b" ] && \
printf "\n\nOK! Check %s/\n\n" "$elfdir"; return 0
}
build_project()
@ -85,8 +85,6 @@ build_targets()
[ -d "$cfgsdir" ] || $err "directory, $cfgsdir, does not exist"
# Build for all targets if no argument is given
[ $# -gt 0 ] && target1="$1"
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && shift 1
targets="$(ls -1 "$cfgsdir")" || $err "Can't get options for $cfgsdir"
[ $# -gt 0 ] && targets=$@
@ -110,12 +108,9 @@ handle_defconfig()
{
handle_src_tree "$target" || return 0
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && \
eval "check_coreboot_utils \"$tree\"; return 0"
for y in "$target_dir/config"/*; do
[ -f "$y" ] || continue
defconfig="$y"
[ "$_f" = "-d" ] || [ -f "$y" ] || continue
[ "$_f" = "-d" ] || defconfig="$y"
[ -n "$mode" ] || check_defconfig || continue
handle_makefile
@ -139,8 +134,7 @@ handle_src_tree()
fi
x_ ./update trees -f "$project" "$target"
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0
[ -z "$mode" ] && check_cross_compiler; return 0
[ -z "$mode" ] && [ "$_f" = "-b" ] && check_cross_compiler; return 0
}
configure_project()
@ -156,6 +150,8 @@ configure_project()
printf "Loading %s config: %s\n" "$project" "$_tcfg"
eval `setcfg "$_tcfg"`
[ "$_f" = "-d" ] && build_depend="" # dry run
[ "$cmd" = "build_project" ] && break
[ "$mode" = "fetch" ] || break
@ -166,13 +162,18 @@ configure_project()
[ "$XBMK_RELEASE" = "y" ] && [ "$release" = "n" ] && return 1
[ -z "$btype" ] || [ "${mode%config}" = "$mode" ] || return 1
[ -z "$mode" ] && for bd in $build_depend; do
bd_project="${bd%%/*}"; bd_tree="${bd##*/}"
[ -z "$bd_project" ] && $err "$project/$tree: bad bd: '$bd'"
[ "${bd##*/}" = "$bd" ] && bd_tree=""
[ -z "$bd_project" ] || ./update trees -b $bd_project \
$bd_tree || $err "$project/$tree: !bd $bd"; continue
done
if [ "$_f" != "-d" ]; then
:
elif [ -z "$mode" ]; then
for bd in $build_depend; do
bd_project="${bd%%/*}"; bd_tree="${bd##*/}"
[ -z "$bd_project" ] && \
$err "$project/$tree: bad bd: '$bd'"
[ "${bd##*/}" = "$bd" ] && bd_tree=""
[ -z "$bd_project" ] || ./update trees -b $bd_project \
$bd_tree || $err "$project/$tree: !bd $bd"
done
fi
[ "$mode" = "fetch" ] || return 0
[ -f "CHANGELOG" ] && return 1; fetch_${cmd#build_}; return 1
@ -198,23 +199,9 @@ check_cross_compiler()
done; return 0
}
check_coreboot_utils()
{
for util in cbfstool ifdtool; do
utilelfdir="elf/$util/$1"
utilsrcdir="src/coreboot/$1/util/$util"
utilmode="" && [ -n "$mode" ] && utilmode="clean"
x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs
[ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ] && \
x_ mkdir -p "$utilelfdir" && \
x_ cp "$utilsrcdir/$util" "elf/$util/$1"
[ -z "$mode" ] || x_ rm -Rf "$utilelfdir"
done; return 0
}
check_defconfig()
{
[ "$_f" = "-d" ] && return 0
[ -f "$defconfig" ] || $err "$project/$target: missing defconfig"
dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}"
@ -225,6 +212,8 @@ check_defconfig()
elfcheck()
{
[ "$_f" = "-d" ] && return 0 # dry run. assume a build exists.
# TODO: very hacky check. do it properly (based on build.list)
for elftest in "$dest_dir"/*; do
[ -e "$elftest" ] && e "$elftest" f && return 1
@ -234,11 +223,12 @@ elfcheck()
handle_makefile()
{
check_makefile "$cdir" && x_ make clean -C "$cdir"
x_ cp "$defconfig" "$cdir/.config"
[ -n "$mode" ] || [ -n "$btype" ] || make -C "$cdir" \
silentoldconfig || make -C "$cdir" oldconfig || :
[ -f "$defconfig" ] && x_ cp "$defconfig" "$cdir/.config"
[ "$_f" = "-d" ] || [ -n "$mode" ] || [ -n "$btype" ] || make -C \
"$cdir" silentoldconfig || make -C "$cdir" oldconfig || :
run_make_command || $err "handle_makefile $cdir: no makefile!"
[ "$_f" = "-d" ] && return 0
_copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig"
[ "${mode%config}" = "$mode" ] || x_ cp "$cdir/$_copy" "$defconfig"
@ -254,17 +244,17 @@ run_make_command()
check_cmake "$cdir" && [ -z "$mode" ] && check_autoconf "$cdir"
check_makefile "$cdir" || return 1
[ "$project" = "coreboot" ] && [ -z "$mode" ] && x_ \
printf "%s\n" "${version%%-*}" > "$cdir/.coreboot-version"
make -C "$cdir" $mode -j$XBMK_THREADS $makeargs || $err "$cdir mk$mode"
[ "$_f" = "-d" ] || make -C "$cdir" $mode -j$XBMK_THREADS $makeargs \
|| $err "$cdir mk$mode"
[ -z "$mkhelper" ] || [ -n "$mode" ] || $mkhelper || $err "!$mkhelper"
[ "$_f" = "-d" ] && return 0
[ "$mode" = "clean" ] && make -C "$cdir" distclean || :; return 0
}
check_cmake()
{
[ "$_f" = "-d" ] && return 0 # dry run
[ -z "$cmakedir" ] || check_makefile "$1" || cmake -B "$1" \
"$1/$cmakedir" || check_makefile "$1" || $err "$1: !cmk $cmakedir"
[ -z "$cmakedir" ] || check_makefile "$1" || \
@ -273,6 +263,7 @@ check_cmake()
check_autoconf()
{
[ "$_f" = "-d" ] && return 0 # dry run
(
cd "$1" || $err "!cd $1"
[ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs
@ -283,12 +274,14 @@ check_autoconf()
check_makefile()
{
[ "$_f" = "-d" ] && return 0 # dry run
[ -f "$1/Makefile" ] || [ -f "$1/makefile" ] || \
[ -f "$1/GNUmakefile" ] || return 1; return 0
}
copy_elf()
{
[ "$_f" = "-d" ] && return 0 # dry run
[ -f "$listfile" ] && x_ mkdir -p "$dest_dir" && while read -r f; do
[ -f "$cdir/$f" ] && x_ cp "$cdir/$f" "$dest_dir"
done < "$listfile"; x_ make clean -C "$cdir"