Skip to contentSkip to conversation

multilib: two step of rpm rootfs installation.

GIT PULL Applied Dongxiao Xu 3 participants 4 messages Sep 21, 2011 – Sep 22, 2011

lore
Share & tools
lore
#0 lore raw

Hi Richard and Saul,

This pull request implement the two step of rpm rootfs installation, please help to review and pull.

Thanks,
Dongxiao

The following changes since commit bcfff457f63f43f53bcaf04f116e09bb2bba9bd6:

Fix mercurial fetcher in fetch2 (2011-09-21 14:07:31 +0100)

are available in the git repository at:
git://git.pokylinux.org/poky-contrib dxu4/ml-testing
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=dxu4/ml-testing

Dongxiao Xu (1):
rootfs_rpm: two step installation

 meta/classes/package_rpm.bbclass |   54 +++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)
#1 lore raw

PATCH 1/1 rootfs_rpm: two step installation

Firstly we install a base image.
Then install those multilib packages listed in MULTILIB_IMAGE_INSTALL.

---
 meta/classes/package_rpm.bbclass |   54 +++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)
meta/classes/package_rpm.bbclass +50 -4
index d822b54..775d525 100644
@@ -166,7 +166,8 @@ package_install_internal_rpm () {
 	local platform="${INSTALL_PLATFORM_RPM}"
 	local platform_extra="${INSTALL_PLATFORM_EXTRA_RPM}"
 	local confbase="${INSTALL_CONFBASE_RPM}"
-	local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM} ${INSTALL_PACKAGES_MULTILIB_RPM}"
+	local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM}"
+	local multilib_to_install="${INSTALL_PACKAGES_MULTILIB_RPM}"
 	local package_attemptonly="${INSTALL_PACKAGES_ATTEMPTONLY_RPM}"
 	local package_linguas="${INSTALL_PACKAGES_LINGUAS_RPM}"
 	local providename="${INSTALL_PROVIDENAME_RPM}"
@@ -253,11 +254,13 @@ package_install_internal_rpm () {
 		done
 	fi
 
+	# Normal package installation
+
 	# Generate an install solution by doing a --justdb install, then recreate it with
 	# an actual package install!
 	${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
 		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
-		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}.macro`" \
+		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-base_archs.macro`" \
 		-D "__dbi_txn create nofsync" \
 		-U --justdb --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \
 		${target_rootfs}/install/install.manifest
@@ -351,14 +354,57 @@ package_install_internal_rpm () {
 		-D "__dbi_txn create nofsync private" \
 		| grep -i 'Packageorigin' | cut -d : -f 2 > ${target_rootfs}/install/install_solution.manifest
 
+	if [ ! -z "${multilib_to_install}" ]; then
+		for pkg in ${multilib_to_install} ; do
+			echo "Processing $pkg..."
+
+			archvar=base_archs
+			ml_prefix=`echo ${pkg} | cut -d'-' -f1`
+			ml_pkg=$pkg
+			for i in ${MULTILIB_PREFIX_LIST} ; do
+				if [ ${ml_prefix} == ${i} ]; then
+					ml_pkg=$(echo ${pkg} | sed "s,^${ml_prefix}-\(.*\),\1,")
+					archvar=ml_archs
+					break
+				fi
+			done
+
+			pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${ml_pkg})
+			if [ -z "$pkg_name" ]; then
+				echo "Unable to find package $pkg ($ml_pkg)!"
+				exit 1
+			fi
+			echo $pkg_name >> ${target_rootfs}/install/install_multilib.manifest
+		done
+	fi
+
+	# multilib package installation
+
+	# Generate an install solution by doing a --justdb install, then recreate it with
+	# an actual package install!
+	${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
+		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
+		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-ml_archs.macro`" \
+		-D "__dbi_txn create nofsync" \
+		-U --justdb --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \
+		${target_rootfs}/install/install_multilib.manifest
+
+	# Now that we have a solution, pull out a list of what to install...
+	echo "Manifest: ${target_rootfs}/install/install_multilib.manifest"
+	${RPM} -D "_dbpath ${target_rootfs}/install" -qa --yaml \
+		-D "__dbi_txn create nofsync private" \
+		| grep -i 'Packageorigin' | cut -d : -f 2 > ${target_rootfs}/install/install_multilib_solution.manifest
+
+
 	# Attempt install
 	${RPM} --root ${target_rootfs} \
 		--predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
 		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
 		-D "_dbpath ${rpmlibdir}" \
-		--noscripts --notriggers --noparentdirs --nolinktos \
+		--noscripts --notriggers --noparentdirs --nolinktos --replacepkgs \
 		-D "__dbi_txn create nofsync private" \
-		-Uhv ${target_rootfs}/install/install_solution.manifest
+		-Uhv ${target_rootfs}/install/install_solution.manifest \
+		${target_rootfs}/install/install_multilib_solution.manifest
 }
 
 python write_specfile () {
Signature · 1 line
1.7.1
Acked-by on v1 1/1
#2 lore raw

Re: [PATCH 1/1] rootfs_rpm: two step installation

Quoted 4 lines · Dongxiao Xu

Firstly we install a base image.
Then install those multilib packages listed in MULTILIB_IMAGE_INSTALL.

I worked with Dongxiao on this solution.

Quoted 93 lines
---
 meta/classes/package_rpm.bbclass |   54 +++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)
meta/classes/package_rpm.bbclass +50 -4
index d822b54..775d525 100644
@@ -166,7 +166,8 @@ package_install_internal_rpm () {
 	local platform="${INSTALL_PLATFORM_RPM}"
 	local platform_extra="${INSTALL_PLATFORM_EXTRA_RPM}"
 	local confbase="${INSTALL_CONFBASE_RPM}"
-	local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM} ${INSTALL_PACKAGES_MULTILIB_RPM}"
+	local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM}"
+	local multilib_to_install="${INSTALL_PACKAGES_MULTILIB_RPM}"
 	local package_attemptonly="${INSTALL_PACKAGES_ATTEMPTONLY_RPM}"
 	local package_linguas="${INSTALL_PACKAGES_LINGUAS_RPM}"
 	local providename="${INSTALL_PROVIDENAME_RPM}"
@@ -253,11 +254,13 @@ package_install_internal_rpm () {
 		done
 	fi
 
+	# Normal package installation
+
 	# Generate an install solution by doing a --justdb install, then recreate it with
 	# an actual package install!
 	${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
 		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
-		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}.macro`" \
+		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-base_archs.macro`" \
 		-D "__dbi_txn create nofsync" \
 		-U --justdb --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \
 		${target_rootfs}/install/install.manifest
@@ -351,14 +354,57 @@ package_install_internal_rpm () {
 		-D "__dbi_txn create nofsync private" \
 		| grep -i 'Packageorigin' | cut -d : -f 2 > ${target_rootfs}/install/install_solution.manifest
 
+	if [ ! -z "${multilib_to_install}" ]; then
+		for pkg in ${multilib_to_install} ; do
+			echo "Processing $pkg..."
+
+			archvar=base_archs
+			ml_prefix=`echo ${pkg} | cut -d'-' -f1`
+			ml_pkg=$pkg
+			for i in ${MULTILIB_PREFIX_LIST} ; do
+				if [ ${ml_prefix} == ${i} ]; then
+					ml_pkg=$(echo ${pkg} | sed "s,^${ml_prefix}-\(.*\),\1,")
+					archvar=ml_archs
+					break
+				fi
+			done
+
+			pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${ml_pkg})
+			if [ -z "$pkg_name" ]; then
+				echo "Unable to find package $pkg ($ml_pkg)!"
+				exit 1
+			fi
+			echo $pkg_name >> ${target_rootfs}/install/install_multilib.manifest
+		done
+	fi
+
+	# multilib package installation
+
+	# Generate an install solution by doing a --justdb install, then recreate it with
+	# an actual package install!
+	${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
+		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
+		-D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-ml_archs.macro`" \
+		-D "__dbi_txn create nofsync" \
+		-U --justdb --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \
+		${target_rootfs}/install/install_multilib.manifest
+
+	# Now that we have a solution, pull out a list of what to install...
+	echo "Manifest: ${target_rootfs}/install/install_multilib.manifest"
+	${RPM} -D "_dbpath ${target_rootfs}/install" -qa --yaml \
+		-D "__dbi_txn create nofsync private" \
+		| grep -i 'Packageorigin' | cut -d : -f 2 > ${target_rootfs}/install/install_multilib_solution.manifest
+
+
 	# Attempt install
 	${RPM} --root ${target_rootfs} \
 		--predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
 		--predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
 		-D "_dbpath ${rpmlibdir}" \
-		--noscripts --notriggers --noparentdirs --nolinktos \
+		--noscripts --notriggers --noparentdirs --nolinktos --replacepkgs \
 		-D "__dbi_txn create nofsync private" \
-		-Uhv ${target_rootfs}/install/install_solution.manifest
+		-Uhv ${target_rootfs}/install/install_solution.manifest \
+		${target_rootfs}/install/install_multilib_solution.manifest
 }
 
 python write_specfile () {
#3 lore raw

Re: [PATCH 1/1] rootfs_rpm: two step installation

In reply to Dongxiao Xu
Quoted 7 lines · Dongxiao Xu

Firstly we install a base image.
Then install those multilib packages listed in MULTILIB_IMAGE_INSTALL.

---
 meta/classes/package_rpm.bbclass |   54 +++++++++++++++++++++++++++++++++++---
 1 files changed, 50 insertions(+), 4 deletions(-)

Merged to master, thanks.

Richard