2023-08-16 20:34:21 +00:00
|
|
|
#!/usr/bin/env sh
|
2023-09-25 01:19:30 +00:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2024-05-26 00:54:36 +00:00
|
|
|
# Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
|
|
|
|
# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
|
|
|
# Copyright (c) 2023-2024 Leah Rowe <leah@libreboot.org>
|
2023-08-16 20:34:21 +00:00
|
|
|
|
|
|
|
set -u -e
|
|
|
|
|
2024-05-26 11:10:27 +00:00
|
|
|
. "include/lib.sh"
|
2023-10-07 05:55:10 +00:00
|
|
|
. "include/git.sh"
|
|
|
|
|
2024-06-06 21:21:59 +00:00
|
|
|
cbmakeargs="UPDATED_SUBMODULES=1 CPUS=$threads"
|
2024-06-06 01:43:27 +00:00
|
|
|
eval "$(setvars "" xarch cdir config config_name xlang mode makeargs \
|
2024-05-26 00:54:36 +00:00
|
|
|
listfile project target target_dir targets tree _f target1 bootstrapargs \
|
2024-06-06 01:43:27 +00:00
|
|
|
autoconfargs cmakedir elfdir autogenargs xtree)"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-08-16 20:34:21 +00:00
|
|
|
main()
|
|
|
|
{
|
2023-10-20 03:10:50 +00:00
|
|
|
while getopts f:b:m:u:c:x:s:l:n: option; do
|
2024-05-26 00:54:36 +00:00
|
|
|
_f="$1"
|
|
|
|
case "$1" in
|
2023-10-07 05:55:10 +00:00
|
|
|
-b) : ;;
|
|
|
|
-u) mode="oldconfig" ;;
|
|
|
|
-m) mode="menuconfig" ;;
|
|
|
|
-c) mode="distclean" ;;
|
|
|
|
-x) mode="crossgcc-clean" ;;
|
|
|
|
-f) mode="fetch" ;;
|
2023-10-13 08:16:41 +00:00
|
|
|
-s) mode="savedefconfig" ;;
|
|
|
|
-l) mode="olddefconfig" ;;
|
|
|
|
-n) mode="nconfig" ;;
|
2024-06-02 23:17:36 +00:00
|
|
|
*) badcmd "invalid option '-$option'" ;;
|
2023-10-07 05:55:10 +00:00
|
|
|
esac
|
|
|
|
shift; project="${OPTARG#src/}"; shift
|
|
|
|
done
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ -z "$_f" ] && $err "missing flag (-m/-u/-b/-c/-x/-f/-s/-l/-n)"
|
|
|
|
[ -z "$project" ] && $err "project name not specified"
|
2024-05-26 00:54:36 +00:00
|
|
|
elfdir="elf/$project"
|
2024-06-06 01:35:36 +00:00
|
|
|
datadir="config/data/$project"
|
2024-05-26 00:54:36 +00:00
|
|
|
cfgsdir="config/$project"
|
2024-06-06 02:08:24 +00:00
|
|
|
listfile="$datadir/build.list" # needed on multi, optional on single
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-12-22 13:05:32 +00:00
|
|
|
_cmd="build_projects"
|
2024-06-06 00:01:22 +00:00
|
|
|
singletree "$project" || _cmd="build_targets"
|
2023-12-22 13:05:32 +00:00
|
|
|
$_cmd $@
|
2024-06-06 07:53:29 +00:00
|
|
|
|
|
|
|
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0
|
2024-06-07 09:32:39 +00:00
|
|
|
|
|
|
|
[ -f "$listfile" ] || return 0
|
2024-06-06 07:53:29 +00:00
|
|
|
[ -z "$mode" ] && printf "\n\nDone! Check %s/\n\n" "$elfdir"; return 0
|
2023-10-07 05:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
build_projects()
|
|
|
|
{
|
2023-12-24 09:04:36 +00:00
|
|
|
[ $# -gt 0 ] && x_ ./update trees $_f $@
|
2024-01-21 22:11:00 +00:00
|
|
|
|
|
|
|
[ "$mode" = "fetch" ] && [ ! -f "CHANGELOG" ] && \
|
|
|
|
eval "fetch_project_repo; return 0;"
|
2023-08-27 13:14:49 +00:00
|
|
|
|
2023-12-30 16:46:49 +00:00
|
|
|
load_project_config "$cfgsdir"
|
2024-06-06 02:08:24 +00:00
|
|
|
[ -f "$listfile" ] || listfile="" # optional on single-tree
|
|
|
|
|
|
|
|
dest_dir="$elfdir"
|
2024-06-07 09:31:01 +00:00
|
|
|
[ ! -f "$listfile" ] || elfcheck || return 0
|
2023-12-30 16:03:29 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
cdir="src/${project}"
|
|
|
|
[ -d "$cdir" ] || x_ ./update trees -f "$project"
|
2023-10-06 21:59:36 +00:00
|
|
|
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "$mode" = "distclean" ] && mode="clean"
|
2023-10-07 05:55:10 +00:00
|
|
|
run_make_command || return 0
|
2024-06-06 02:08:24 +00:00
|
|
|
|
|
|
|
[ -n "$mode" ] || copy_elf; return 0
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
build_targets()
|
2023-10-03 12:21:30 +00:00
|
|
|
{
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "$elfdir" = "elf/coreboot" ] && \
|
2023-10-10 05:04:47 +00:00
|
|
|
elfdir="elf/coreboot_nopayload_DO_NOT_FLASH"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ -d "$cfgsdir" ] || $err "directory, $cfgsdir, does not exist"
|
|
|
|
[ -f "$listfile" ] || $err "list file, $listfile, does not exist"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
|
|
|
# Build for all targets if no argument is given
|
2023-12-24 09:04:36 +00:00
|
|
|
[ $# -gt 0 ] && target1="$1"
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && shift 1
|
|
|
|
targets="$(items "$cfgsdir")" || $err "Can't get options for $cfgsdir"
|
2023-10-03 12:21:30 +00:00
|
|
|
[ $# -gt 0 ] && targets=$@
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_targets
|
|
|
|
}
|
|
|
|
|
|
|
|
handle_targets()
|
|
|
|
{
|
2023-12-24 09:04:36 +00:00
|
|
|
for x in $targets; do
|
2024-05-26 00:54:36 +00:00
|
|
|
target="$x"
|
|
|
|
printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target"
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "$project" != "coreboot" ] || [ -n "$mode" ] || \
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$target1" = "utils" ] || x_ ./vendor download $target
|
2023-10-07 05:55:10 +00:00
|
|
|
x_ handle_defconfig
|
|
|
|
done
|
2023-10-03 12:21:30 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_defconfig()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-12-24 09:04:36 +00:00
|
|
|
handle_src_tree "$target" || return 0
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2023-12-27 17:26:37 +00:00
|
|
|
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && \
|
2024-06-06 21:17:16 +00:00
|
|
|
eval "check_coreboot_utils \"$tree\"; return 0"
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
for y in "$target_dir/config"/*; do
|
2023-12-24 09:04:36 +00:00
|
|
|
[ -f "$y" ] || continue
|
|
|
|
config="$y"
|
2024-05-26 00:54:36 +00:00
|
|
|
config_name="${config#"$target_dir/config/"}"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-12-24 09:04:36 +00:00
|
|
|
[ -n "$mode" ] || check_config || continue
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_makefile
|
2023-12-24 09:04:36 +00:00
|
|
|
[ -n "$mode" ] || copy_elf
|
2023-10-07 05:55:10 +00:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
handle_src_tree()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
target_dir="$cfgsdir/$target"
|
2024-01-21 22:11:00 +00:00
|
|
|
[ "$mode" = "fetch" ] && [ ! -f "CHANGELOG" ] && \
|
|
|
|
eval "fetch_project_trees; return 1;"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2023-12-30 16:46:49 +00:00
|
|
|
load_project_config "$target_dir"
|
2024-05-26 00:54:36 +00:00
|
|
|
x_ mkdir -p "$elfdir/$target"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ -z "$tree" ] && $err "handle_src_tree $project/$tree: tree unset"
|
2024-05-26 00:54:36 +00:00
|
|
|
cdir="src/$project/$tree"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
if [ ! -d "$cdir" ]; then
|
2023-12-24 09:04:36 +00:00
|
|
|
if [ "$mode" = "distclean" ] || \
|
|
|
|
[ "$mode" = "crossgcc-clean" ]; then
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "Directory %s missing; skip\n" "$cdir" 1>&2
|
2023-10-07 05:55:10 +00:00
|
|
|
return 1
|
|
|
|
fi
|
2023-12-24 09:04:36 +00:00
|
|
|
x_ ./update trees -f "$project" "$target"
|
2023-10-07 05:55:10 +00:00
|
|
|
fi
|
|
|
|
|
2023-12-22 13:05:32 +00:00
|
|
|
[ "$target1" = "utils" ] && [ "$project" = "coreboot" ] && return 0
|
2023-12-28 16:34:45 +00:00
|
|
|
[ -z "$mode" ] && check_cross_compiler; return 0
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-12-30 16:46:49 +00:00
|
|
|
load_project_config()
|
2023-12-30 16:03:29 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
eval "$(setvars "" xarch xlang tree bootstrapargs autoconfargs xtree \
|
|
|
|
tree_depend makeargs)"
|
2023-12-30 16:03:29 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$1/target.cfg" ] || return 0
|
|
|
|
. "$1/target.cfg" || $err "loadp $1: can't load target.cfg"; return 0
|
2023-12-30 16:03:29 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
check_cross_compiler()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2023-12-27 15:18:21 +00:00
|
|
|
for _xarch in $xarch; do
|
2024-05-26 00:54:36 +00:00
|
|
|
cbdir="src/coreboot/$tree"
|
2023-12-27 15:18:21 +00:00
|
|
|
[ "$project" != "coreboot" ] && cbdir="src/coreboot/default"
|
2024-01-21 05:58:37 +00:00
|
|
|
[ -n "$xtree" ] && cbdir="src/coreboot/$xtree"
|
2023-12-21 10:48:07 +00:00
|
|
|
|
2023-12-27 15:18:21 +00:00
|
|
|
x_ ./update trees -f coreboot ${cbdir#src/coreboot/}
|
2023-12-21 10:48:07 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
export PATH="$PWD/$cbdir/util/crossgcc/xgcc/bin:$PATH"
|
2023-12-27 15:18:21 +00:00
|
|
|
export CROSS_COMPILE="${xarch% *}-"
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang"
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -d "$cbdir/util/crossgcc/xgcc/$_xarch/" ] && continue
|
2024-06-06 21:21:59 +00:00
|
|
|
x_ make -C "$cbdir" crossgcc-${_xarch%-*} $cbmakeargs
|
2023-12-21 10:48:07 +00:00
|
|
|
done
|
2023-10-07 05:55:10 +00:00
|
|
|
}
|
2023-08-16 20:34:21 +00:00
|
|
|
|
2024-06-06 21:17:16 +00:00
|
|
|
check_coreboot_utils()
|
|
|
|
{
|
|
|
|
for util in cbfstool ifdtool; do
|
|
|
|
utilelfdir="elf/$util/$1"
|
|
|
|
utilsrcdir="src/coreboot/$1/util/$util"
|
|
|
|
|
|
|
|
utilmode=""
|
|
|
|
[ -z "$mode" ] || utilmode="clean"
|
2024-06-06 21:21:59 +00:00
|
|
|
x_ make -C "$utilsrcdir" $utilmode -j$threads $cbmakeargs
|
2024-06-06 21:17:16 +00:00
|
|
|
[ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ] && \
|
|
|
|
x_ mkdir -p "$utilelfdir" && \
|
|
|
|
x_ cp "$utilsrcdir/$util" "elf/$util/$1"
|
|
|
|
[ -z "$mode" ] || x_ rm -Rf "$utilelfdir"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
check_config()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$config" ] || $err "check_config $project/$target: no config"
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
dest_dir="$elfdir/$target/$config_name"
|
2024-06-06 08:20:45 +00:00
|
|
|
elfcheck || return 1 # skip build if a previous one exists
|
|
|
|
|
|
|
|
x_ mkdir -p "$dest_dir"
|
|
|
|
}
|
|
|
|
|
|
|
|
elfcheck()
|
|
|
|
{
|
2023-10-07 05:55:10 +00:00
|
|
|
# TODO: very hacky check. do it properly (based on build.list)
|
2024-05-26 00:54:36 +00:00
|
|
|
for elftest in "$dest_dir"/*; do
|
2024-06-07 10:20:45 +00:00
|
|
|
[ -e "$elftest" ] || continue
|
2024-05-26 00:54:36 +00:00
|
|
|
e "$elftest" f && return 1
|
2023-08-16 20:34:21 +00:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
handle_makefile()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
make GRUB multi-tree and re-add xhci patches
Re-add xHCI only on haswell and broadwell machines, where
they are needed. Otherwise, keep the same GRUB code.
The xHCI patches were removed because they caused issues
on Sandybridge-based Dell Latitude laptops. See:
https://codeberg.org/libreboot/lbmk/issues/216
The issue was not reported elsewhere, including on the
Haswell/Broadwell hardware where they are needed, but the
build system could only build one version of GRUB.
The older machines do not need xHCI patches, because they
either do not have xHCI patches, or work (in GRUB) because
they're in EHCI mode when running the payload.
So, the problem is that we need the xHCI patches for GRUB
on Haswell/Broadwell hardware, but the patches break
Sandybridge hardware, and we only had the one build of GRUB.
To mitigate this problem, the build system now supports
building multiple revisions of GRUB, with different patches,
and each given coreboot target can say which GRUB tree to use
by setting this in target.cfg:
grubtree="xhci"
In the above example, the "xhci" tree would be used. Some
generic GRUB config has been moved to config/data/grub/
and config/grub/ now looks like config/coreboot/ - also,
the grub.cfg file (named "payload" in each tree) is copied
to the GRUB source tree as ".config", then added to GRUB's
memdisk in the same way, as grub.cfg.
Several other design changes had to be made because of this:
* grub.cfg in memdisk no longer automatically jumps to one
in CBFS, but now shows a menuentry for it if available
* Certain commands in script/trees are disabled for GRUB,
such as *config make commands.
* gnulib is now defined in config/submodule/grub/, instead
of config/git/grub - and this mitigates an existing bug
where downloading gnulib first would make grub no longer
possible to download in lbmk.
The coreboot option CONFIG_FINALIZE_USB_ROUTE_XHCI has been
re-enabled on: Dell OptiPlex 9020 MT, Dell OptiPlex 9020 SFF,
Lenovo ThinkPad T440p and Lenovo ThinkPad W541 - now USB should
work again in GRUB.
The GRUB payload has been re-enabled on HP EliteBook 820 G2.
This change will enable per-board GRUB optimisation in the
future. For example, we hardcode what partitions and LVMs
GRUB scans because * is slow on ICH7-based machines, due
to GRUB's design. On other machines, * is reasonably fast,
for automatically enumerating the list of devices for boot.
Use of * (and other wildcards) could enable our GRUB payload
to automatically boot more distros, with minimal fuss. This
can be done at a later date, in subsequent revisions.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-06-01 22:01:30 +00:00
|
|
|
[ "$project" = "grub" ] && [ "${mode%config}" != "$mode" ] && return 0
|
|
|
|
|
|
|
|
check_makefile "$cdir" && x_ make clean -C "$cdir"
|
|
|
|
x_ cp "$config" "$cdir/.config"
|
|
|
|
[ -n "$mode" ] || [ "$project" = "grub" ] || make -C "$cdir" \
|
|
|
|
silentoldconfig || make -C "$cdir" oldconfig || :
|
2023-10-07 05:55:10 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
run_make_command || $err "handle_makefile $cdir: no makefile!"
|
2023-10-02 04:21:20 +00:00
|
|
|
|
2024-04-28 18:28:02 +00:00
|
|
|
_copy=".config"
|
|
|
|
[ "$mode" = "savedefconfig" ] && _copy="defconfig"
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "${mode%config}" = "$mode" ] || x_ cp "$cdir/$_copy" "$config"
|
2024-04-28 18:28:02 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -e "$cdir/.git" ] && [ "$project" = "u-boot" ] && \
|
|
|
|
[ "$mode" = "distclean" ] && x_ git -C "$cdir" clean -fdx; return 0
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
run_make_command()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
check_cmake "$cdir"
|
|
|
|
[ -z "$mode" ] && check_autoconf "$cdir"
|
|
|
|
check_makefile "$cdir" || return 1
|
2023-12-30 13:08:29 +00:00
|
|
|
|
2023-12-30 20:30:24 +00:00
|
|
|
[ "$project" = "coreboot" ] && [ -z "$mode" ] && x_ \
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "%s\n" "${version%%-*}" > "$cdir/.coreboot-version" \
|
2024-06-06 21:21:59 +00:00
|
|
|
&& makeargs="$makeargs $cbmakeargs"
|
2024-05-24 23:22:34 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
make -C "$cdir" $mode -j$threads $makeargs || $err "!mk $cdir $mode"
|
2023-12-30 13:08:29 +00:00
|
|
|
|
make GRUB multi-tree and re-add xhci patches
Re-add xHCI only on haswell and broadwell machines, where
they are needed. Otherwise, keep the same GRUB code.
The xHCI patches were removed because they caused issues
on Sandybridge-based Dell Latitude laptops. See:
https://codeberg.org/libreboot/lbmk/issues/216
The issue was not reported elsewhere, including on the
Haswell/Broadwell hardware where they are needed, but the
build system could only build one version of GRUB.
The older machines do not need xHCI patches, because they
either do not have xHCI patches, or work (in GRUB) because
they're in EHCI mode when running the payload.
So, the problem is that we need the xHCI patches for GRUB
on Haswell/Broadwell hardware, but the patches break
Sandybridge hardware, and we only had the one build of GRUB.
To mitigate this problem, the build system now supports
building multiple revisions of GRUB, with different patches,
and each given coreboot target can say which GRUB tree to use
by setting this in target.cfg:
grubtree="xhci"
In the above example, the "xhci" tree would be used. Some
generic GRUB config has been moved to config/data/grub/
and config/grub/ now looks like config/coreboot/ - also,
the grub.cfg file (named "payload" in each tree) is copied
to the GRUB source tree as ".config", then added to GRUB's
memdisk in the same way, as grub.cfg.
Several other design changes had to be made because of this:
* grub.cfg in memdisk no longer automatically jumps to one
in CBFS, but now shows a menuentry for it if available
* Certain commands in script/trees are disabled for GRUB,
such as *config make commands.
* gnulib is now defined in config/submodule/grub/, instead
of config/git/grub - and this mitigates an existing bug
where downloading gnulib first would make grub no longer
possible to download in lbmk.
The coreboot option CONFIG_FINALIZE_USB_ROUTE_XHCI has been
re-enabled on: Dell OptiPlex 9020 MT, Dell OptiPlex 9020 SFF,
Lenovo ThinkPad T440p and Lenovo ThinkPad W541 - now USB should
work again in GRUB.
The GRUB payload has been re-enabled on HP EliteBook 820 G2.
This change will enable per-board GRUB optimisation in the
future. For example, we hardcode what partitions and LVMs
GRUB scans because * is slow on ICH7-based machines, due
to GRUB's design. On other machines, * is reasonably fast,
for automatically enumerating the list of devices for boot.
Use of * (and other wildcards) could enable our GRUB payload
to automatically boot more distros, with minimal fuss. This
can be done at a later date, in subsequent revisions.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-06-01 22:01:30 +00:00
|
|
|
[ "$project" = "grub" ] && [ -z "$mode" ] && mkpayload_grub
|
|
|
|
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "$mode" != "clean" ] && return 0
|
2024-05-26 00:54:36 +00:00
|
|
|
make -C "$cdir" distclean 2>/dev/null || :
|
2023-08-16 20:34:21 +00:00
|
|
|
}
|
|
|
|
|
update/trees: generic cmake handling
it is no longer hardcoded just to be handled for uefiextract.
it is now defined as cmakedir in target.cfg, for a single or
multi tree project. if multi tree, it is applied to the specific
tree, and has to be defined per tree
the way it works is: as per cmakelist, a project will define
which directory is to be built, and it will then generate
a makefile in the main source tree (the build tree in cmake
language, where the main CMakeLists.txt file exists)
when the makefile has been generated, the project is then treated
like any other project. the way cmake works, if a makefile has
already been generated by it, in a given directory, running it
again will fail and not affect anything; if it fails but the
makefile doesn't exist, then something is wrong, but if the
makefile does exist, then it's all fine and nothing happens
at present, this is only used for uefiextract, which is part
of src/uefitool
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-12-30 16:52:34 +00:00
|
|
|
check_cmake()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -z "$cmakedir" ] || check_makefile "$1" || cmake -B "$1" \
|
|
|
|
"$1/$cmakedir" || check_makefile "$1" || $err "$1: !cmk $cmakedir"
|
|
|
|
[ -z "$cmakedir" ] || check_makefile "$1" || \
|
|
|
|
$err "check_cmake $1: can't generate Makefile"; return 0
|
update/trees: generic cmake handling
it is no longer hardcoded just to be handled for uefiextract.
it is now defined as cmakedir in target.cfg, for a single or
multi tree project. if multi tree, it is applied to the specific
tree, and has to be defined per tree
the way it works is: as per cmakelist, a project will define
which directory is to be built, and it will then generate
a makefile in the main source tree (the build tree in cmake
language, where the main CMakeLists.txt file exists)
when the makefile has been generated, the project is then treated
like any other project. the way cmake works, if a makefile has
already been generated by it, in a given directory, running it
again will fail and not affect anything; if it fails but the
makefile doesn't exist, then something is wrong, but if the
makefile does exist, then it's all fine and nothing happens
at present, this is only used for uefiextract, which is part
of src/uefitool
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-12-30 16:52:34 +00:00
|
|
|
}
|
|
|
|
|
2023-12-30 13:08:29 +00:00
|
|
|
check_autoconf()
|
|
|
|
{
|
|
|
|
(
|
2024-05-26 00:54:36 +00:00
|
|
|
cd "$1" || $err "!cd $1"
|
2023-12-30 16:03:29 +00:00
|
|
|
[ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "autogen.sh" ] && x_ ./autogen.sh $autogenargs
|
2023-12-30 16:03:29 +00:00
|
|
|
[ -f "configure" ] && x_ ./configure $autoconfargs; return 0
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
) || $err "can't bootstrap project: $1"
|
2023-12-30 13:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
check_makefile()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$1/Makefile" ] || [ -f "$1/makefile" ] || \
|
|
|
|
[ -f "$1/GNUmakefile" ] || return 1; return 0
|
2023-12-30 13:08:29 +00:00
|
|
|
}
|
|
|
|
|
make GRUB multi-tree and re-add xhci patches
Re-add xHCI only on haswell and broadwell machines, where
they are needed. Otherwise, keep the same GRUB code.
The xHCI patches were removed because they caused issues
on Sandybridge-based Dell Latitude laptops. See:
https://codeberg.org/libreboot/lbmk/issues/216
The issue was not reported elsewhere, including on the
Haswell/Broadwell hardware where they are needed, but the
build system could only build one version of GRUB.
The older machines do not need xHCI patches, because they
either do not have xHCI patches, or work (in GRUB) because
they're in EHCI mode when running the payload.
So, the problem is that we need the xHCI patches for GRUB
on Haswell/Broadwell hardware, but the patches break
Sandybridge hardware, and we only had the one build of GRUB.
To mitigate this problem, the build system now supports
building multiple revisions of GRUB, with different patches,
and each given coreboot target can say which GRUB tree to use
by setting this in target.cfg:
grubtree="xhci"
In the above example, the "xhci" tree would be used. Some
generic GRUB config has been moved to config/data/grub/
and config/grub/ now looks like config/coreboot/ - also,
the grub.cfg file (named "payload" in each tree) is copied
to the GRUB source tree as ".config", then added to GRUB's
memdisk in the same way, as grub.cfg.
Several other design changes had to be made because of this:
* grub.cfg in memdisk no longer automatically jumps to one
in CBFS, but now shows a menuentry for it if available
* Certain commands in script/trees are disabled for GRUB,
such as *config make commands.
* gnulib is now defined in config/submodule/grub/, instead
of config/git/grub - and this mitigates an existing bug
where downloading gnulib first would make grub no longer
possible to download in lbmk.
The coreboot option CONFIG_FINALIZE_USB_ROUTE_XHCI has been
re-enabled on: Dell OptiPlex 9020 MT, Dell OptiPlex 9020 SFF,
Lenovo ThinkPad T440p and Lenovo ThinkPad W541 - now USB should
work again in GRUB.
The GRUB payload has been re-enabled on HP EliteBook 820 G2.
This change will enable per-board GRUB optimisation in the
future. For example, we hardcode what partitions and LVMs
GRUB scans because * is slow on ICH7-based machines, due
to GRUB's design. On other machines, * is reasonably fast,
for automatically enumerating the list of devices for boot.
Use of * (and other wildcards) could enable our GRUB payload
to automatically boot more distros, with minimal fuss. This
can be done at a later date, in subsequent revisions.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-06-01 22:01:30 +00:00
|
|
|
mkpayload_grub()
|
|
|
|
{
|
|
|
|
[ -f "$grubdata/module/$tree" ] || $err "$tree: grub modules missing"
|
|
|
|
x_ rm -f "$cdir/grub.elf"
|
|
|
|
|
|
|
|
eval "$(setvars "" grub_modules grub_install_modules)"
|
|
|
|
|
|
|
|
. "$grubdata/module/$tree" || $err "$tree: !source grub modules"
|
|
|
|
|
|
|
|
[ -z "$grub_install_modules" ] && $err "$tree: install modules unset"
|
|
|
|
[ -z "$grub_modules" ] && $err "$tree: modules unset"
|
|
|
|
|
|
|
|
"${cdir}/grub-mkstandalone" --grub-mkimage="${cdir}/grub-mkimage" \
|
|
|
|
-O i386-coreboot -o "${cdir}/grub.elf" -d "${cdir}/grub-core/" \
|
|
|
|
--fonts= --themes= --locales= --modules="$grub_modules" \
|
|
|
|
--install-modules="$grub_install_modules" \
|
|
|
|
"/boot/grub/grub.cfg=${cdir}/.config" || $err "$tree: !mkgrub"
|
|
|
|
}
|
|
|
|
|
2023-10-07 05:55:10 +00:00
|
|
|
copy_elf()
|
2023-08-16 20:34:21 +00:00
|
|
|
{
|
2024-06-07 11:04:28 +00:00
|
|
|
[ -n "$listfile" ] || return 0
|
2024-06-07 09:35:38 +00:00
|
|
|
[ -f "$listfile" ] || return 0
|
2024-06-06 02:08:24 +00:00
|
|
|
|
2024-06-07 14:02:32 +00:00
|
|
|
x_ mkdir -p "$dest_dir"
|
|
|
|
|
2023-12-16 07:56:26 +00:00
|
|
|
while read -r f; do
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$cdir/$f" ] && x_ cp "$cdir/$f" "$dest_dir"
|
2023-12-24 09:04:36 +00:00
|
|
|
done < "$listfile"
|
2024-05-26 00:54:36 +00:00
|
|
|
x_ make clean -C "$cdir"
|
much, much stricter, more verbose error handling
lbmk is much more likely to crash now, in error conditions,
which is a boon for further auditing.
also: in "fetch", remove the downloaded program
if fail() was called.
this would also be done for gnulib, when downloading
grub, but done in such a way that gnulib goes first.
where calls to err write "ERROR" in the string, they
no longer say "ERROR" because the "err" function itself
now does that automatically.
also: listmodes/listoptions (in "lbmk") now reports an
error if no scripts and/or directories are found.
also: where a warning is given, but not an error, i've
gone through in some places and redirected the output
to stderr, not stdout
as part of error checks: running anything as root, except
for the "./build dependencies *" commands, is no longer
permitted and lbmk will throw an error
mrc downloads: debugfs output no longer redirected to /dev/null,
and stderr no longer redirected to stdout. everything is verbose.
certain non-error states are also more verbose. for example,
patch_rom in blobs/inject will now state when injection succeeds
certain actual errors(bugs) were fixed:
for example, build/release/roms now correctly prepares the blobs
hash files for a given target, containing only the files and
checksums in the list. Previously, a printf message was included.
Now, with this new code: blobutil/inject rightly verifies hashes.
doing all of this in one giant patch is cleaner
than 100 patches changing each file. even this is yet part
of a much larger audit going on in the Libreboot project.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-24 19:19:41 +00:00
|
|
|
}
|
|
|
|
|
2023-08-16 20:34:21 +00:00
|
|
|
main $@
|