summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2024-07-17 14:55:49 +0100
committerLeah Rowe <leah@libreboot.org>2024-07-17 16:34:34 +0100
commit0b9cd77fe7ff6ded9425f12f3651615e1863aa87 (patch)
tree880ef575a66bffffc082ac102bab5e24d1497b1a /script
parent4438368c0cc0a0a8d16de8f7fab78c777c21ca1b (diff)
trees: auto-delete+auto-rebuild if project changes
actual source code is not scanned, but config directories are scanned. simply get the checksum of each file under config/ pertaining to a given project/tree, and also for the given target. coreboot utilities are also handled. if it changes, in any way, delete and re-build automatically. such deletions should probably still be done manually, as part of understanding the build system, but this change should make the build system much easier to use during development. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'script')
-rwxr-xr-xscript/trees49
1 files changed, 47 insertions, 2 deletions
diff --git a/script/trees b/script/trees
index c31152fb..23164ee6 100755
--- a/script/trees
+++ b/script/trees
@@ -12,7 +12,7 @@ set -u -e
eval `setvars "" xarch srcdir premake cmakedir xlang mode makeargs elfdir cmd \
project target target_dir targets xtree _f release bootstrapargs mkhelper \
autoconfargs listfile autogenargs btype tree rev tree_depend build_depend \
- defconfig postmake mkhelpercfg dry dest_dir`
+ defconfig postmake mkhelpercfg dry dest_dir mdir badhash`
main()
{
@@ -116,7 +116,8 @@ handle_defconfig()
configure_project()
{
eval `setvars "" xarch xlang build_depend autoconfargs xtree postmake \
- tree_depend makeargs btype mkhelper bootstrapargs premake release`
+ tree_depend makeargs btype mkhelper bootstrapargs premake release \
+ badhash`
[ -f "$1/target.cfg" ] || btype="auto"
[ -f "$datadir/mkhelper.cfg" ] && eval `setcfg "$datadir/mkhelper.cfg"`
@@ -141,6 +142,11 @@ configure_project()
[ -z "$mode" ] && build_dependencies
+ mdir="$PWD/config/submodule/$project"
+ [ -n "$tree" ] && mdir="$mdir/$tree"
+
+ [ -f "CHANGELOG" ] || check_project_hashes
+
[ "$mode" = "fetch" ] || x_ ./update trees -f "$project" $target
[ "$mode" = "fetch" ] || return 0
@@ -158,6 +164,45 @@ build_dependencies()
done; return 0
}
+check_project_hashes()
+{
+ x_ mkdir -p hash
+
+ old_pjhash=""
+ [ ! -f "hash/$project$tree" ] || \
+ read -r old_pjhash < "hash/$project$tree"
+
+ x_ rm -f "$TMPDIR/project.list" "$TMPDIR/project.hash" \
+ "$TMPDIR/project.tmp"; x_ touch "$TMPDIR/project.tmp"
+ x_ touch "$TMPDIR/project.hash"
+
+ for delcheck in "$datadir" "$configdir/$tree" "$mdir"; do
+ [ -d "$delcheck" ] || continue
+ find "$delcheck" -type f -not -path "*/.git*/*" \
+ >> "$TMPDIR/project.tmp" || \
+ $err "!find $delcheck > project.tmp"
+ done
+ sort "$TMPDIR/project.tmp" > "$TMPDIR/project.list" || \
+ $err "!sort project tmp/list"
+
+ while read -r delcheck; do
+ [ -f "$delcheck" ] || continue
+ sha512sum "$delcheck" | awk '{print $1}' >> \
+ "$TMPDIR/project.hash" || $err "!findhash $delcheck"
+ done < "$TMPDIR/project.list"
+
+ pjhash="$(sha512sum "$TMPDIR/project.hash" | awk '{print $1}')" || :
+ badhash="y" && [ "$pjhash" = "$old_pjhash" ] && badhash="n"
+ [ -f "hash/$project$tree" ] || badhash="y"
+
+ printf "%s\n" "$pjhash" > "hash/$project$tree" || \
+ $err "!mk hash/$project$tree"
+
+ [ "$badhash" = "n" ] || rm -Rf "src/$project/$tree" \
+ "elf/$project/$tree" "elf/$project/$target" || \
+ $err "!rmproject $project $tree"; :
+}
+
check_cross_compiler()
{
for _xarch in $xarch; do