summaryrefslogtreecommitdiff
path: root/include/tree.sh
diff options
context:
space:
mode:
Diffstat (limited to 'include/tree.sh')
-rw-r--r--include/tree.sh95
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
}