forked from OpenDingux/buildroot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
utils/add-custom-hashes: add script to manage global patch dir hashes
Add a script to manage the .hash files in the BR2_GLOBAL_PATCH_DIR for packages using custom versions. To use it, run in a configured Buildroot directory, E.G. make foo_defconfig; ./utils/add-custom-hashes We support multiple patch directories in BR2_GLOBAL_PATCH_DIR. If multiple directories are specified then use the last one as that is likely to be the most specific one. Signed-off-by: Peter Korsgaard <[email protected]> [Peter: silence command -v invocation] Signed-off-by: Peter Korsgaard <[email protected]>
- Loading branch information
Showing
2 changed files
with
105 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
#!/usr/bin/env bash | ||
set -e | ||
|
||
# Add hash files for packages with custom versions for | ||
# BR2_DOWNLOAD_FORCE_CHECK_HASHES=y | ||
# | ||
# Run in a configured Buildroot directory, E.G. | ||
# make foo_defconfig; ./utils/add-custom-hashes | ||
|
||
# print BR-style message | ||
# message <info message> | ||
message() { | ||
tput smso 2>/dev/null | ||
echo "$*" | ||
tput rmso 2>/dev/null | ||
} | ||
|
||
# print error message and exit | ||
# die <error message> | ||
die() { | ||
echo "Error: $*" >&2 | ||
exit 1 | ||
} | ||
|
||
# get package(s) for download file, if any | ||
# get_pkgs <json> <file> | ||
get_pkgs() { | ||
jq --arg file "$2" -r \ | ||
'to_entries[] | select(.value.downloads[0].source == $file) | .key | strings' "$1" | ||
} | ||
|
||
# get download dir for package | ||
# get_pkg_dl_dir <json> <package> | ||
get_pkg_dl_dir() { | ||
jq --arg pkg "$2" -r '.[$pkg].dl_dir | strings' "$1" | ||
} | ||
|
||
# generate hash file for download file | ||
# gen_hash <dir> <file> | ||
gen_hash() { | ||
( | ||
cd "$1" && printf '# Locally calculated\nsha256 ' && sha256sum "$2" | ||
) | ||
} | ||
|
||
command -v jq >/dev/null || die 'Script needs jq' | ||
|
||
[ -e .config ] || \ | ||
die "No .config found, please run this in a configured Buildroot (O=) directory" | ||
|
||
message Collecting data | ||
|
||
eval "$(make -s VARS='TOPDIR DL_DIR BR_NO_CHECK_HASH_FOR BR2_GLOBAL_PATCH_DIR' QUOTED_VARS=YES printvars)" | ||
# global patch dir may already have quotes | ||
BR2_GLOBAL_PATCH_DIR=$(echo "$BR2_GLOBAL_PATCH_DIR" | tr -d '"') | ||
|
||
[ -n "$BR2_GLOBAL_PATCH_DIR" ] || die "No BR2_GLOBAL_PATCH_DIR defined, nothing to do" | ||
[ -n "$BR_NO_CHECK_HASH_FOR" ] || die "No packages without hashes found, nothing to do" | ||
|
||
[ -d "$TOPDIR" ] || die "TOPDIR ($TOPDIR) does not look correct" | ||
[ -d "$DL_DIR" ] || die "DL_DIR ($DL_DIR) does not look correct" | ||
|
||
# patch dir may contain multiple dirs, use the last one | ||
# shellcheck disable=SC2086 # we need the word splitting | ||
set -- $BR2_GLOBAL_PATCH_DIR | ||
if [ $# -gt 1 ]; then | ||
BR2_GLOBAL_PATCH_DIR="${!#}"; | ||
message BR2_GLOBAL_PATCH_DIR contains multiple directories, using "$BR2_GLOBAL_PATCH_DIR" | ||
fi | ||
|
||
# patch dir may be relative to TOPDIR | ||
case "$BR2_GLOBAL_PATCH_DIR" in | ||
/*) ;; | ||
*) BR2_GLOBAL_PATCH_DIR="$TOPDIR/$BR2_GLOBAL_PATCH_DIR" | ||
;; | ||
esac | ||
|
||
[ -d "$BR2_GLOBAL_PATCH_DIR" ] \ | ||
|| die "BR2_GLOBAL_PATCH_DIR ($BR2_GLOBAL_PATCH_DIR) does not look correct" | ||
|
||
trap 'rm -f "$JSON"' EXIT | ||
JSON=$(mktemp) | ||
make show-info > "$JSON" | ||
|
||
# ensure files have been downloaded, but without checking | ||
make BR2_DOWNLOAD_FORCE_CHECK_HASHES= source | ||
|
||
message Updating hashes | ||
|
||
for file in $BR_NO_CHECK_HASH_FOR; do | ||
for pkg in $(get_pkgs "$JSON" "$file"); do | ||
HASHFILE="$BR2_GLOBAL_PATCH_DIR/$pkg/$pkg.hash" | ||
PKG_DL_DIR=$(get_pkg_dl_dir "$JSON" "$pkg") | ||
message "Adding hash for $file to $HASHFILE" | ||
mkdir -p "${HASHFILE%/*}" | ||
gen_hash "$DL_DIR/$PKG_DL_DIR" "$file" > "$HASHFILE" | ||
done | ||
done | ||
|
||
message Verifying hashes | ||
|
||
make clean | ||
make BR2_DOWNLOAD_FORCE_CHECK_HASHES=y source |