build_dev_binpkgs: Refactor the script with better Bash techniques

Signed-off-by: James Le Cuirot <jlecuirot@microsoft.com>
This commit is contained in:
James Le Cuirot 2025-04-17 11:22:17 +01:00
parent 7073a6a7b6
commit 78167629ba
No known key found for this signature in database
GPG Key ID: 1226415D00DD3137

View File

@ -19,18 +19,18 @@ skip_packages_default="dev-lang/rust,dev-lang/rust-bin,dev-lang/go,dev-lang/go-b
# Developer-visible flags. # Developer-visible flags.
DEFINE_string board "${DEFAULT_BOARD}" \ DEFINE_string board "${DEFAULT_BOARD}" \
"The board to build packages for." "The board to build packages for."
DEFINE_string skip_packages "${skip_packages_default[@]}" \ DEFINE_string skip_packages "${skip_packages_default}" \
"Comma-separated list of packages in the dependency tree to skip." "Comma-separated list of packages in the dependency tree to skip."
DEFINE_boolean pretend "${FLAGS_FALSE}" \ DEFINE_boolean pretend "${FLAGS_FALSE}" \
"List packages that would be built but do not actually build." "List packages that would be built but do not actually build."
FLAGS_HELP="usage: $(basename $0) [flags] [packages] FLAGS_HELP="usage: $(basename "$0") [flags] [packages]
build_dev_binpkgs builds binary packages for all dependencies of [packages] build_dev_binpkgs builds binary packages for all dependencies of [packages]
that are not present in '/build/<board>/var/lib/portage/pkgs/'. that are not present in '/build/<board>/var/lib/portage/pkgs/'.
Useful for publishing a complete set of packages to a binhost. Useful for publishing a complete set of packages to a binhost.
[packages] defaults to '${packages_default}' if not specified. [packages] defaults to '${packages_default[*]}' if not specified.
" "
# Parse command line # Parse command line
@ -46,43 +46,36 @@ fi
# -- # --
function my_board_emerge() { function my_board_emerge() {
PORTAGE_CONFIGROOT="/build/${FLAGS_board}" SYSROOT="${SYSROOT:-/build/${FLAGS_board}}" ROOT="/build/${FLAGS_board}" sudo -E emerge "${@}" PORTAGE_CONFIGROOT="/build/${FLAGS_board}" SYSROOT="${SYSROOT:-/build/${FLAGS_board}}" ROOT="/build/${FLAGS_board}" sudo -E emerge "${@}"
} }
# -- # --
pkg_build_list="$(mktemp)" pkg_build_list=()
pkg_skipped_list="${pkg_build_list}-skip" pkg_skipped_list=()
trap 'rm -f "${pkg_build_list}" "${pkg_skipped_list}"' EXIT
info "Collecting list of binpkgs to build" info "Collecting list of binpkgs to build"
my_board_emerge --pretend --emptytree ${@} \ while read -r pkg; do
| grep '\[ebuild' \ [[ -f /build/${FLAGS_board}/var/lib/portage/pkgs/${pkg}.tbz2 ]] && continue
| sed 's/^\[[^]]\+\] \([^ :]\+\)*:.*/\1/' \ IFS=,
| while read pkg; do for s in ${FLAGS_skip_packages}; do
if [ -f "/build/${FLAGS_board}/var/lib/portage/pkgs/${pkg}.tbz2" ] ; then if [[ ${pkg} == ${s}-* ]] ; then
continue pkg_skipped_list+=("${pkg}")
fi continue 2
skip=""
for s in ${FLAGS_skip_packages//,/ }; do
if [[ ${pkg} = ${s}-* ]] ; then
echo -n "${pkg} " >> "${pkg_skipped_list}"
skip="true"
break
fi fi
done done
[[ -z ${skip} ]] || continue unset IFS
echo "=${pkg}" | tee -a "${pkg_build_list}" | sed 's/^/ /' pkg_build_list+=("=${pkg}")
done echo " =${pkg}"
done < <(my_board_emerge --pretend --emptytree "${@}" |
grep '\[ebuild' | sed 's/^\[[^]]\+\] \([^ :]\+\)*:.*/\1/')
# -- # --
if [ -f "${pkg_skipped_list}" ] ; then if [[ ${#pkg_skipped_list[@]} -gt 0 ]]; then
info "Skipping binpkgs '$(cat "${pkg_skipped_list}")' because these are in the skip list." info "Skipping binpkgs '${pkg_skipped_list[*]}' because these are in the skip list."
fi fi
pretend="" pretend=""
if [[ "${FLAGS_pretend}" -eq "${FLAGS_TRUE}" ]]; then [[ ${FLAGS_pretend} -eq ${FLAGS_TRUE} ]] && pretend="--pretend"
pretend="--pretend"
fi
my_board_emerge --buildpkg ${pretend} $(cat "${pkg_build_list}") my_board_emerge --buildpkg ${pretend} "${pkg_build_list[@]}"