summaryrefslogtreecommitdiff
path: root/include/tree.sh
diff options
context:
space:
mode:
Diffstat (limited to 'include/tree.sh')
-rw-r--r--include/tree.sh175
1 files changed, 106 insertions, 69 deletions
diff --git a/include/tree.sh b/include/tree.sh
index 4d0c533d..44c41a6f 100644
--- a/include/tree.sh
+++ b/include/tree.sh
@@ -3,18 +3,18 @@
# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
# Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org>
-eval "`setvars "" xarch srcdir premake gnatdir xlang mode makeargs elfdir cmd \
+eval "$(setvars "" xarch srcdir premake gnatdir tree mode makeargs elfdir cmd \
project target target_dir targets xtree _f release bootstrapargs mkhelper \
autoconfargs listfile autogenargs btype rev build_depend gccdir cmakedir \
defconfig postmake mkhelpercfg dry dest_dir mdir cleanargs gccver gccfull \
- gnatver gnatfull do_make badhash tree`"
+ gnatver gnatfull do_make badhash badtghash xlang)"
trees()
{
flags="f:b:m:u:c:x:s:l:n:d:"
while getopts $flags option; do
- [ -n "$_f" ] && err "only one flag is permitted"
+ [ -n "$_f" ] && err "only one flag is permitted" "trees" "$@"
_f="$1"
case "$_f" in
@@ -30,7 +30,7 @@ trees()
-s) mode="savedefconfig" ;;
-l) mode="olddefconfig" ;;
-n) mode="nconfig" ;;
- *) err "invalid option '-$option'" ;;
+ *) err "invalid option '-$option'" "trees" "$@" ;;
esac
if [ -z "${OPTARG+x}" ]; then
@@ -39,16 +39,14 @@ trees()
fi
project="${OPTARG#src/}"
+ project="${project#config/git/}"
shift 2
done
- [ -z "$_f" ] && err "missing flag ($flags)"
- if [ -z "$project" ]; then
- mk $_f $(ls -1 config/git)
- return 1
- fi
+ [ -z "$_f" ] && err "missing flag ($flags)" "trees" "$@"
+ [ -z "$project" ] && fx_ "x_ ./mk $_f" x_ ls -1 config/git && return 1
[ -f "config/git/$project/pkg.cfg" ] || \
- err "config/git/$project/pkg.cfg missing"
+ err "config/git/$project/pkg.cfg missing" "trees" "$@"
for d in "elf" "config/data" "config" "src"; do
eval "${d#*/}dir=\"$d/$project\""
@@ -60,7 +58,7 @@ trees()
mkhelpercfg="$datadir/mkhelper.cfg"
if e "$mkhelpercfg" f missing; then
- mkhelpercfg="$xbmktmp/mkhelper.cfg"
+ mkhelpercfg="$xbtmp/mkhelper.cfg"
x_ touch "$mkhelpercfg"
fi
@@ -84,8 +82,10 @@ build_project()
build_targets()
{
- [ -d "$configdir" ] || err "directory, $configdir, does not exist"
- [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || err "!o $configdir"
+ [ -d "$configdir" ] || \
+ err "directory, $configdir, does not exist" "build_targets" "$@"
+ [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || \
+ err "can't fetch targets in '$configdir'" "build_targets" "$@"
for x in $targets; do
unset CROSS_COMPILE
@@ -107,23 +107,22 @@ handle_defconfig()
[ -f "CHANGELOG" ] || fetch_project "$project"
configure_project "$target_dir" || return 0
- x_ mkdir -p "$elfdir/$target"
chkvars tree
srcdir="src/$project/$tree"
- if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then
- [ -d "$srcdir" ] || return 0
- fi
- [ -z "$mode" ] && for _xarch in $xarch; do
- $dry check_cross_compiler "$_xarch"
- done; :
+ [ "$mode" = "${mode%clean}" ] && [ ! -d "$srcdir" ] && return 0
for y in "$target_dir/config"/*; do
[ "$_f" = "-d" ] || [ -f "$y" ] || continue
[ "$_f" = "-d" ] || defconfig="$y"
[ -n "$mode" ] || check_defconfig || continue
+
+ [ -z "$mode" ] && for _xarch in $xarch; do
+ $dry check_cross_compiler "$_xarch"
+ done; :
+
handle_makefile
[ -n "$mode" ] || $dry copy_elf
done; :
@@ -131,16 +130,16 @@ handle_defconfig()
configure_project()
{
- eval "`setvars "" cleanargs build_depend autoconfargs xtree postmake \
+ eval "$(setvars "" cleanargs build_depend autoconfargs xtree postmake \
makeargs btype mkhelper bootstrapargs premake release xlang xarch \
- badhash`"
+ badhash badtghash)"
_tcfg="$1/target.cfg"
[ -f "$_tcfg" ] || btype="auto"
- e "$datadir/mkhelper.cfg" f && eval "`setcfg "$datadir/mkhelper.cfg"`"
+ e "$datadir/mkhelper.cfg" f && eval "$(setcfg "$datadir/mkhelper.cfg")"
while e "$_tcfg" f || [ "$cmd" != "build_project" ]; do
- eval "`setvars "" rev tree`"
- eval "`setcfg "$_tcfg"`"
+ eval "$(setvars "" rev tree)"
+ eval "$(setcfg "$_tcfg")"
printf "Loading %s config: %s\n" "$project" "$_tcfg"
[ "$_f" = "-d" ] && build_depend="" # dry run
@@ -157,7 +156,7 @@ configure_project()
mdir="$xbmkpwd/config/submodule/$project"
[ -n "$tree" ] && mdir="$mdir/$tree"
- [ -f "CHANGELOG" ] || check_project_hashes
+ [ -f "CHANGELOG" ] || delete_old_project_files
if [ "$do_make" = "n" ]; then
[ -f "CHANGELOG" ] || fetch_${cmd#build_}
@@ -171,54 +170,85 @@ build_dependencies()
for bd in $build_depend; do
bd_p="${bd%%/*}"
bd_t="${bd##*/}"
- [ -z "$bd_p" ] && $dry err "$project/$tree: !bd '$bd'"
+ [ -z "$bd_p" ] && $dry err "$project/$tree: !bd '$bd'" \
+ "build_dependencies" "$@"
[ "${bd##*/}" = "$bd" ] && bd_t=""
[ -z "$bd_p" ] || $dry x_ ./mk -b $bd_p $bd_t; :
done; :
}
-check_project_hashes()
+delete_old_project_files()
+{
+ project_up_to_date hash "$tree" badhash "$datadir" "$configdir/$tree" \
+ "$mdir" || x_ rm -Rf "src/$project/$tree" "elf/$project/$tree"; :
+ x_ cp "$xbtmp/new.hash" "$XBMK_CACHE/hash/$project$tree"
+
+ singletree "$project" && return 0
+ [ -z "$target" ] && return 0
+ [ "$target" = "$tree" ] && return 0
+
+ project_up_to_date tghash "$target" badtghash \
+ "$configdir/$target" || x_ rm -Rf "elf/$project/$tree/$target"; :
+ x_ cp "$xbtmp/new.hash" "$XBMK_CACHE/tghash/$project$target"
+}
+
+project_up_to_date()
{
- old_pjhash="" && x_ mkdir -p "$XBMK_CACHE/hash"
- [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \
- read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree"
+ eval "$(setvars "" old_hash hash)"
+ hashdir="$1"
+ hashname="$2"
+ badhashvar="$3"
+ shift 3
+
+ x_ mkdir -p "$XBMK_CACHE/$hashdir"
+
+ [ ! -f "$XBMK_CACHE/$hashdir/$project$hashname" ] || \
+ read -r old_hash < "$XBMK_CACHE/$hashdir/$project$hashname" || \
+ err "$hashdir: read err '$XBMK_CACHE/$hashdir/$project$hashname'" \
+ "project_up_to_date" "$hashdir" "$hashname" "$badhashvar" "$@"
- fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \
- -type f -not -path "*/.git*/*" | awk '{print $1}' > \
- "$xbmktmp/project.hash" || err "!h $project $tree"
+ fx_ "x_ sha512sum" find "$@" -type f -not -path "*/.git*/*" | awk \
+ '{print $1}' > "$xbtmp/tmp.hash" || err "!h $project $hashdir" \
+ "project_up_to_date" "$hashdir" "$hashname" "$badhashvar" "$@"
- pjhash="$(sha512sum "$xbmktmp/project.hash" | awk '{print $1}')" || :
- [ "$pjhash" != "$old_pjhash" ] && badhash="y"
- [ -f "$XBMK_CACHE/hash/$project$tree" ] || badhash="y"
+ hash="$(x_ sha512sum "$xbtmp/tmp.hash" | awk '{print $1}' || \
+ err)" || err "$hashname: Can't read sha512 of '$xbtmp/tmp.hash'" \
+ "project_up_to_date" "$hashdir" "$hashname" "$badhashvar" "$@"
- printf "%s\n" "$pjhash" > "$XBMK_CACHE/hash/$project$tree" || \
- err "!mk $XBMK_CACHE/hash/$project$tree"
+ [ "$hash" != "$old_hash" ] && eval "$badhashvar=\"y\""
+ [ -f "$XBMK_CACHE/$hashdir/$project$hashname" ] || \
+ eval "$badhashvar=\"y\""
- [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \
- "elf/$project/$tree" "elf/$project/$target"; :
+ printf "%s\n" "$hash" > "$xbtmp/new.hash" || \
+ err "!mkhash $xbtmp/new.hash ($hashdir $hashname $badhashvar)" \
+ "project_up_to_date" "$hashdir" "$hashname" "$badhashvar" "$@"
+
+ eval "[ \"\$$badhashvar\" = \"y\" ] && return 1"; :
}
check_cross_compiler()
{
cbdir="src/coreboot/$tree"
+ xfix="${1%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64"
+ xgccfile="elf/coreboot/$tree/xgcc_${xfix}_was_compiled"
+ xgccargs="crossgcc-$xfix UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS"
+
[ "$project" != "coreboot" ] && cbdir="src/coreboot/default"
[ -n "$xtree" ] && cbdir="src/coreboot/$xtree"
x_ ./mk -f coreboot "${cbdir#src/coreboot/}"
+ x_ mkdir -p "elf/coreboot/$tree"
export PATH="$xbmkpwd/$cbdir/util/crossgcc/xgcc/bin:$PATH"
export CROSS_COMPILE="${xarch% *}-"
[ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang"
+ [ -f "$xgccfile" ] && return 0 # skip build if already done
- # match gnat-X to gcc
check_gnu_path gcc gnat || x_ check_gnu_path gnat gcc
-
- xfix="${1%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64"
- xgccargs="crossgcc-$xfix UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS"
make -C "$cbdir" $xgccargs || x_ make -C "$cbdir" $xgccargs
+ x_ touch "$xgccfile"
- # we only want to mess with hostcc to build xgcc
- remkdir "$XBMK_CACHE/gnupath"
+ remkdir "$xbtmp/gnupath" # reset hostcc
}
# fix mismatching gcc/gnat versions on debian trixie/sid. as of december 2024,
@@ -227,10 +257,12 @@ check_cross_compiler()
# gnat in PATH never resolves to gnat-14, because gnat-14 was "experimental"
check_gnu_path()
{
- command -v "$1" 1>/dev/null || err "Host '$1' unavailable"
+ command -v "$1" 1>/dev/null || \
+ err "Host '$1' unavailable" "check_gnu_path" "$@"
- eval "`setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir`"
- x_ gnu_setver "$1" "$1" || err "Command '$1' unavailable."
+ eval "$(setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir)"
+ x_ gnu_setver "$1" "$1" || \
+ err "Command '$1' unavailable." "check_gnu_path" "$@"
gnu_setver "$2" "$2" || :
eval "[ -z \"\$$1ver\" ] && err \"Cannot detect host '$1' version\""
@@ -246,18 +278,20 @@ check_gnu_path()
[ "$gnatfull" = "$gccfull" ] || return 1
(
- remkdir "$XBMK_CACHE/gnupath" && x_ cd "$XBMK_CACHE/gnupath"
+ remkdir "$xbtmp/gnupath"
+ x_ cd "$xbtmp/gnupath"
for _gnubin in "$_gnudir/$2"*"-$_gnuver"; do
_gnuutil="${_gnubin##*/}" && [ -e "$_gnubin" ] && \
x_ ln -s "$_gnubin" "${_gnuutil%"-$_gnuver"}"
done
- ) || err "Cannot create $2-$_gnuver link in $_gnudir"; :
+ ) || err "Cannot symlink '$2-$_gnuver' in '$_gnudir'" \
+ "check_gnu_path" "$@"; :
}
gnu_setver()
{
eval "$2 --version 1>/dev/null 2>/dev/null || return 1"
- eval "$1ver=\"`"$2" --version 2>/dev/null | head -n1`\""
+ eval "$1ver=\"$("$2" --version 2>/dev/null | head -n1)\""
eval "$1ver=\"\${$1ver##* }\""
eval "$1full=\"\$$1ver\""
eval "$1ver=\"\${$1ver%%.*}\""; :
@@ -265,28 +299,27 @@ gnu_setver()
check_defconfig()
{
- [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig"
- dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}"
+ [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" \
+ "check_defconfig" "$@"
+ dest_dir="$elfdir/$tree/$target/${defconfig#"$target_dir/config/"}"
- $dry elfcheck || return 1 # skip build if a previous one exists
- $dry x_ mkdir -p "$dest_dir"
+ $dry elfcheck || return 1; : # skip build if a previous one exists
}
elfcheck()
{
# TODO: *STILL* very hacky check. do it properly (based on build.list)
- ( fx_ "exit 1" find "$dest_dir" -type f ) || return 1; :
+ ( fx_ "eval exit 1 && err" find "$dest_dir" -type f ) || return 1; :
}
handle_makefile()
{
- $dry check_makefile "$srcdir" && x_ make -C "$srcdir" $cleanargs clean
+ $dry check_makefile "$srcdir" && \
+ $dry x_ make -C "$srcdir" $cleanargs clean
[ -f "$defconfig" ] && x_ cp "$defconfig" "$srcdir/.config"
- [ -n "$mode" ] || [ -n "$btype" ] || $dry make -C \
- "$srcdir" silentoldconfig || make -C "$srcdir" oldconfig || :
- run_make_command || err "handle_makefile $srcdir: no makefile!"
+ run_make_command || err "no makefile!" "handle_makefile" "$@"
_copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig"
[ "${mode%config}" = "$mode" ] || \
@@ -308,8 +341,10 @@ run_make_command()
$dry x_ make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs
[ -n "$mode" ] || x_ $mkhelper
+ check_makefile "$srcdir" || return 0
[ "$mode" != "clean" ] || \
- $dry make -C "$srcdir" $cleanargs distclean || :; :
+ $dry make -C "$srcdir" $cleanargs distclean || \
+ $dry x_ make -C "$srcdir" $cleanargs clean; :
}
check_cmake()
@@ -322,11 +357,11 @@ check_cmake()
check_autoconf()
{
(
- cd "$1" || err "!cd $1"
+ x_ cd "$1"
[ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs
[ -f "autogen.sh" ] && x_ ./autogen.sh $autogenargs
[ -f "configure" ] && x_ ./configure $autoconfargs; :
- ) || err "can't bootstrap project: $1"; :
+ ) || err "can't bootstrap project: $1" "check_autoconf" "$@"; :
}
check_makefile()
@@ -337,8 +372,10 @@ check_makefile()
copy_elf()
{
- [ -f "$listfile" ] && x_ mkdir -p "$dest_dir" && while read -r f; do
- [ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir"
- done < "$listfile"
- x_ make clean -C "$srcdir" $cleanargs
+ [ -f "$listfile" ] && x_ mkdir -p "$dest_dir"
+ [ ! -f "$listfile" ] || while read -r f; do
+ [ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir"; :
+ done < "$listfile" || err "cannot read '$listfile'" "copy_elf" "$@"; :
+ ( x_ make clean -C "$srcdir" $cleanargs ) || \
+ err "can't make-clean '$srcdir'" "copy_elf" "$@"; :
}