[arch-projects] [DEVTOOLS][PATCH 2/3] archbuild: install packages in one call to pacman

seblu at archlinux.org seblu at archlinux.org
Thu Aug 13 20:56:41 UTC 2015


From: Sébastien Luttringer <seblu at seblu.net>

In order to install/downgrade packages with dependencies (e.g gcc-multilib),
pass all packages to install in a row to pacman.

As a side improvement, when a package installation fails, build fails.
---
 makechrootpkg.in | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/makechrootpkg.in b/makechrootpkg.in
index 3c8a20f..447157d 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -126,23 +126,26 @@ clean_temporary() {
 	stat_done
 }
 
+# install packages in one call to pacman to let it manage correctly
+# dependencies between packages
 install_packages() {
-	local pkgname
+	(( ${#install_pkgs[*]} == 0 )) && return 0
 
-	for install_pkg in "${install_pkgs[@]}"; do
-		pkgname="${install_pkg##*/}"
-		cp "$install_pkg" "$copydir/$pkgname"
+	local src dst
+	local -a dsts
 
-		arch-nspawn "$copydir" \
-			"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
-			pacman -U /$pkgname --noconfirm
-		(( ret += !! $? ))
-
-		rm "$copydir/$pkgname"
+	for src in "${install_pkgs[@]}"; do
+		dst=/"${src##*/}"
+		dsts+=("$dst")
+		cp "$src" "$copydir$dst"
 	done
 
-	# If there is no PKGBUILD we are done
-	[[ -f PKGBUILD ]] || exit $ret
+	arch-nspawn "$copydir" "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
+		pacman -U "${dsts[@]}" --noconfirm || exit $?
+
+	for dst in "${dsts[@]}"; do
+		rm "$copydir$dst"
+	done
 }
 
 prepare_chroot() {
@@ -384,6 +387,9 @@ $update_first && arch-nspawn "$copydir" \
 
 [[ -n ${install_pkgs[*]} ]] && install_packages
 
+# If there is no PKGBUILD we are done
+[[ -f PKGBUILD ]] || exit 0
+
 download_sources
 
 prepare_chroot
-- 
Sébastien "Seblu" Luttringer


More information about the arch-projects mailing list