diff options
Diffstat (limited to 'include/tree.sh')
-rw-r--r-- | include/tree.sh | 175 |
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" "$@"; : } |