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. this behaviour will be used to integrate vendor.sh logic in with the trees script, for cases where the user wants to only handle vendor files. e.g.: ./update trees -b coreboot x230_12mb this would download the files as usual, build coreboot, with those files, and then build the payloads. but: ./update trees -d coreboot x230_12mb this would download the files, NOT build coreboot, and NOT build the payloads. this change increases the sloccount a bit, but i'm relying on the fact that the vendor.sh script already re-implements config handling wastefully; the plan is to only use trees. for now, simply stub the same ./vendor download command. there is one additional benefit to doing it this way: this method is *per-kconfig* rather than per-target. this way, one kconfig might specify a given vendor file that is not specified in the other. although the stub still simply handles this per target, it's done in premake, which means that the given .config file has been copied. this means that when i properly re-integrate the logic into script/trees, i'll be able to go for it per-kconfig. the utils command has been removed, e.g. ./update trees -b coreboot utils default the equivalent is now: ./update trees -d coreboot default this would technically download vendor files, but here we are specifying a target for which no kconfigs exist; a check is also in place, to avoid running the vendor file download logic if tree==target 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>audit6
parent
e850c06bd2
commit
9646172145
|
@ -9,5 +9,6 @@ v="$v displaymode tmprom"
|
|||
eval `setvars "n" $pv`
|
||||
eval `setvars "" $v`
|
||||
|
||||
premake="mkvendorfiles"
|
||||
mkhelper="mkcorebootbin"
|
||||
postmake="mkcoreboottar"
|
||||
|
|
|
@ -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,35 @@ 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
|
||||
[ -z "$mode" ] && [ "$target" != "$tree" ] && \
|
||||
x_ ./vendor download $target; return 0
|
||||
}
|
||||
|
||||
mkcorebootbin()
|
||||
{
|
||||
[ "$_f" = "-d" ] && return 0 # dry run
|
||||
[ "$target" = "$tree" ] && return 0
|
||||
|
||||
tmprom="$cdir/build/coreboot.rom"
|
||||
|
@ -64,7 +93,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
|
||||
|
@ -117,6 +146,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
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ bootstrap()
|
|||
[ -d "${kbc1126_ec_dump%/*}" ] && x_ make -C "$cbdir/util/kbc1126"
|
||||
[ -n "$MRC_refcode_cbtree" ] && \
|
||||
cbfstoolref="elf/cbfstool/$MRC_refcode_cbtree/cbfstool" && \
|
||||
x_ ./update trees -b coreboot utils $MRC_refcode_cbtree; return 0
|
||||
x_ ./update trees -d coreboot $MRC_refcode_cbtree; return 0
|
||||
}
|
||||
|
||||
getfiles()
|
||||
|
@ -275,7 +275,7 @@ readcfg()
|
|||
cbfstool="elf/cbfstool/$tree/cbfstool"
|
||||
ifdtool="elf/ifdtool/$tree/ifdtool"
|
||||
|
||||
x_ ./update trees -b coreboot utils $tree
|
||||
x_ ./update trees -d coreboot $tree
|
||||
}
|
||||
|
||||
patch_release_roms()
|
||||
|
|
83
script/trees
83
script/trees
|
@ -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=$@
|
||||
|
||||
|
@ -100,8 +98,6 @@ handle_targets()
|
|||
listfile="" && break
|
||||
target="$x"
|
||||
printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target"
|
||||
[ "$project" != "coreboot" ] || [ -n "$mode" ] || \
|
||||
[ "$target1" = "utils" ] || x_ ./vendor download $target
|
||||
x_ handle_defconfig
|
||||
[ -n "$mode" ] || [ -z "$postmake" ] || $postmake || \
|
||||
$err "$project/$target: !postmake: $postmake"; continue
|
||||
|
@ -112,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
|
||||
|
@ -141,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()
|
||||
|
@ -158,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
|
||||
|
||||
|
@ -168,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
|
||||
|
@ -200,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/"}"
|
||||
|
@ -227,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
|
||||
|
@ -236,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"
|
||||
|
@ -256,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" || \
|
||||
|
@ -275,6 +263,7 @@ check_cmake()
|
|||
|
||||
check_autoconf()
|
||||
{
|
||||
[ "$_f" = "-d" ] && return 0 # dry run
|
||||
(
|
||||
cd "$1" || $err "!cd $1"
|
||||
[ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs
|
||||
|
@ -285,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"
|
||||
|
|
Loading…
Reference in New Issue