diff options
Diffstat (limited to 'include/tree.sh')
-rw-r--r-- | include/tree.sh | 95 |
1 files changed, 67 insertions, 28 deletions
diff --git a/include/tree.sh b/include/tree.sh index 4d0c533d..1f635e23 100644 --- a/include/tree.sh +++ b/include/tree.sh @@ -7,7 +7,7 @@ eval "`setvars "" xarch srcdir premake gnatdir xlang 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 tree`" trees() { @@ -39,13 +39,11 @@ 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 "$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" @@ -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 @@ -107,14 +105,12 @@ 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 + [ "$mode" = "${mode%clean}" ] && [ ! -d "$srcdir" ] && return 0 + [ -z "$mode" ] && for _xarch in $xarch; do $dry check_cross_compiler "$_xarch" done; : @@ -133,7 +129,7 @@ configure_project() { 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"`" @@ -177,17 +173,25 @@ build_dependencies() done; : } +# delete src/project/TREE and elf/project/TREE if configs +# change on the given tree, but don't check configs e.g. +# don't check x200_8mb/ files if building for x200_8mb check_project_hashes() { - old_pjhash="" && x_ mkdir -p "$XBMK_CACHE/hash" + eval "`setvars "" old_pjhash pjhash`" + x_ mkdir -p "$XBMK_CACHE/hash" + [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ - read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" + read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" || \ + err "old_pjhash: Can't read '$XBMK_CACHE/hash/$project$tree'" fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \ -type f -not -path "*/.git*/*" | awk '{print $1}' > \ - "$xbmktmp/project.hash" || err "!h $project $tree" + "$xbtmp/project.hash" || err "!h $project $tree" + + pjhash="$(x_ sha512sum "$xbtmp/project.hash" | awk '{print $1}' || \ + err)" || err "pjhash: Can't read sha512 of '$xbtmp/project.hash'" - pjhash="$(sha512sum "$xbmktmp/project.hash" | awk '{print $1}')" || : [ "$pjhash" != "$old_pjhash" ] && badhash="y" [ -f "$XBMK_CACHE/hash/$project$tree" ] || badhash="y" @@ -195,7 +199,41 @@ check_project_hashes() err "!mk $XBMK_CACHE/hash/$project$tree" [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ - "elf/$project/$tree" "elf/$project/$target"; : + "elf/$project/$tree"; : + + singletree "$project" || check_target_hash; : +} + +# delete elf/project/TREE/TARGET on a given target, within a +# multi-tree project; this happens even if the given tree isn't +# deleted. for example, if coreboot/default doesn't change but +# the x200_8mb/ files change, delete the x200_8mb files +check_target_hash() +{ + [ -n "$target" ] || return 0 + + eval "`setvars "" old_tghash tghash`" + x_ mkdir -p "$XBMK_CACHE/tghash" + + [ ! -f "$XBMK_CACHE/tghash/$project$target" ] || \ + read -r old_tghash < "$XBMK_CACHE/tghash/$project$target" || \ + err "t: Can't read '$XBMK_CACHE/tghash/$project$target'" + + fx_ "x_ sha512sum" find "$configdir/$target" \ + -type f -not -path "*/.git*/*" | awk '{print $1}' > \ + "$xbtmp/target.hash" || err "!ht $project $target" + + tghash="$(x_ sha512sum "$xbtmp/target.hash" | awk '{print $1}' \ + || err)" || err "tghash: !read sha512 '$xbtmp/target.hash'" + + [ "$tghash" != "$old_tghash" ] && badtghash="y"; : + [ -f "$XBMK_CACHE/tghash/$project$target" ] || badtghash="y"; : + + printf "%s\n" "$tghash" > "$XBMK_CACHE/tghash/$project$target" || \ + err "!mk $XBMK_CACHE/tghash/$project$target" + + [ "$badtghash" != "y" ] || \ + x_ rm -Rf "elf/$project/$tree/$target"; : } check_cross_compiler() @@ -266,25 +304,23 @@ gnu_setver() check_defconfig() { [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" - dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" + 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!" @@ -308,8 +344,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,7 +360,7 @@ 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; : @@ -337,8 +375,9 @@ 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" + [ -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 "copy_elf $*: cannot read '$listfile'"; : x_ make clean -C "$srcdir" $cleanargs } |