From 055c9be15ba094e0fcd4aca9fc8e55c6e95c295f Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Wed, 17 Jul 2024 14:55:49 +0100 Subject: [PATCH] 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 --- .gitignore | 1 + build | 1 + include/git.sh | 5 +---- include/rom.sh | 2 ++ script/trees | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 0d03069..8d1573f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ /CHANGELOG /todo.txt /lock +/hash/ diff --git a/build b/build index 1f6a94e..d1ff9e9 100755 --- a/build +++ b/build @@ -95,6 +95,7 @@ build_release() cd "$srcdir" || $err "$vdir: !cd \"$srcdir\"" ./update trees -f rmgit . + x_ rm -Rf hash repo x_ mv src/docs docs ) || $err "can't create release files" diff --git a/include/git.sh b/include/git.sh index 27b79c1..0de4c93 100644 --- a/include/git.sh +++ b/include/git.sh @@ -2,7 +2,7 @@ # Copyright (c) 2020-2021,2023-2024 Leah Rowe # Copyright (c) 2022 Caleb La Grange -eval `setvars "" loc url bkup_url subfile mdir subhash subrepo subrepo_bkup \ +eval `setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \ depend subfile_bkup` fetch_targets() @@ -69,9 +69,6 @@ git_prep() prep_submodules() { - mdir="$PWD/config/submodule/$project" - [ -n "$tree" ] && mdir="$mdir/$tree" - [ -f "$mdir/module.list" ] && while read -r msrcdir; do fetch_submodule "$msrcdir" done < "$mdir/module.list"; return 0 diff --git a/include/rom.sh b/include/rom.sh index f2bc37f..ae9c605 100644 --- a/include/rom.sh +++ b/include/rom.sh @@ -51,6 +51,8 @@ mkvendorfiles() check_coreboot_utils() { for util in cbfstool ifdtool; do + [ "$badhash" = "n" ] || rm -f "elf/$util/$1/$util" || \ + $err "!rm badelf elf/$util/$1/$util" e "elf/$util/$1/$util" f && continue utilelfdir="elf/$util/$1" diff --git a/script/trees b/script/trees index c31152f..23164ee 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