summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Yang <liezhi.yang@windriver.com>2012-08-21 14:48:48 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-08-21 12:15:31 +0100
commit46b3ab1f2bdd01041c91ad1576351f1e4e948f2b (patch)
treeeef1c362f197b6e6ffafa1a1596084127f2f3efb
parent40d3579cedb9d115145abaa0955e3f097260b90a (diff)
downloadpoky-46b3ab1f2bdd01041c91ad1576351f1e4e948f2b.tar.gz
package_rpm.bbclass: fix and enhance the incremental rpm generation
The incremental rpm generation usually broke when package_rpm.bbclass changed, change its implementation to make it more stable: * It depended on the previous and current saved manifest files in the past, it would break when the manifest changed. Now query the previous and current installed pkgs from rootfs/var/lib and rootfs/install/, this would be more reliable, the manifest's change would not affect it any more. * Add explanations before package_install_internal_rpm to explain what does the function do. * Remove an unwanted "awk '{print $1}'". [YOCTO #2906] (From OE-Core rev: 5d8ca498e09438bd91654fa8b8b2c970956d88e3) Signed-off-by: Robert Yang <liezhi.yang@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/package_rpm.bbclass68
1 files changed, 43 insertions, 25 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index d0f69bf40f..9abad5e093 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -158,38 +158,41 @@ rpm_common_comand () {
158rpm_update_pkg () { 158rpm_update_pkg () {
159 159
160 manifest=$1 160 manifest=$1
161 btmanifest=$manifest.bt.manifest 161 # The manifest filename, e.g. total_solution.manifest
162 pre_btmanifest=${T}/${btmanifest##/*/} 162 m_name=${manifest##/*/}
163 local target_rootfs="${INSTALL_ROOTFS_RPM}" 163 local target_rootfs="${INSTALL_ROOTFS_RPM}"
164 164 installdir=$target_rootfs/install
165 # Save the rpm's build time for incremental image generation, and the file 165 pre_btmanifest=$installdir/pre_bt.manifest
166 # would be moved to ${T} 166 cur_btmanifest=$installdir/cur_bt.manifest
167 for i in `cat $manifest`; do 167
168 # Use "rpm" rather than "${RPM}" here, since we don't need the 168 # Install/remove the different pkgs when total_solution.manifest is
169 # '--dbpath' option 169 # comming and incremental image generation is enabled.
170 echo "$i `rpm -qp --qf '%{BUILDTIME}\n' $i`" 170 if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -d "${target_rootfs}${rpmlibdir}" \
171 done | sort -u > $btmanifest 171 -a "$m_name" = "total_solution.manifest" \
172 172 -a "${INSTALL_COMPLEMENTARY_RPM}" != "1" ]; then
173 # Only install the different pkgs if incremental image generation is set 173 # Get the previous installed list
174 if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f "$pre_btmanifest" -a \ 174 rpm --root $target_rootfs --dbpath ${rpmlibdir} \
175 "${IMAGE_PKGTYPE}" = "rpm" ]; then 175 -qa --qf '%{PACKAGEORIGIN} %{BUILDTIME}\n' | sort -u -o $pre_btmanifest
176 comm -1 -3 $btmanifest $pre_btmanifest | sed 's#.*/\(.*\)\.rpm .*#\1#' > \ 176 # Get the current installed list (based on install/var/lib/rpm)
177 ${target_rootfs}/install/remove.manifest 177 rpm --root $installdir -D "_dbpath $installdir" \
178 comm -2 -3 $btmanifest $pre_btmanifest | awk '{print $1}' > \ 178 -qa --qf '%{PACKAGEORIGIN} %{BUILDTIME}\n' | sort -u -o $cur_btmanifest
179 ${target_rootfs}/install/incremental.manifest 179 comm -1 -3 $cur_btmanifest $pre_btmanifest | sed 's#.*/\(.*\)\.rpm .*#\1#' > \
180 $installdir/remove.manifest
181 comm -2 -3 $cur_btmanifest $pre_btmanifest | awk '{print $1}' > \
182 $installdir/incremental.manifest
180 183
181 # Attempt to remove unwanted pkgs, the scripts(pre, post, etc.) has not 184 # Attempt to remove unwanted pkgs, the scripts(pre, post, etc.) has not
182 # been run by now, so don't have to run them(preun, postun, etc.) when 185 # been run by now, so don't have to run them(preun, postun, etc.) when
183 # erase the pkg 186 # erase the pkg
184 if [ -s ${target_rootfs}/install/remove.manifest ]; then 187 if [ -s $installdir/remove.manifest ]; then
185 rpm_common_comand --noscripts --nodeps \ 188 rpm_common_comand --noscripts --nodeps \
186 -e `cat ${target_rootfs}/install/remove.manifest` 189 -e `cat $installdir/remove.manifest`
187 fi 190 fi
188 191
189 # Attempt to install the incremental pkgs 192 # Attempt to install the incremental pkgs
190 if [ -s ${target_rootfs}/install/incremental.manifest ]; then 193 if [ -s $installdir/incremental.manifest ]; then
191 rpm_common_comand --nodeps --replacefiles --replacepkgs \ 194 rpm_common_comand --nodeps --replacefiles --replacepkgs \
192 -Uvh ${target_rootfs}/install/incremental.manifest 195 -Uvh $installdir/incremental.manifest
193 fi 196 fi
194 else 197 else
195 # Attempt to install 198 # Attempt to install
@@ -242,7 +245,22 @@ process_pkg_list_rpm() {
242} 245}
243 246
244# 247#
245# install a bunch of packages using rpm 248# Install a bunch of packages using rpm.
249# There are 3 solutions in an image's FRESH generation:
250# 1) initial_solution
251# 2) total_solution
252# 3) COMPLEMENTARY solution
253#
254# It is different when incremental image generation is enabled in the
255# SECOND generation:
256# 1) The initial_solution is skipped.
257# 2) The incremental image generation takes action during the total_solution
258# installation, the previous installed COMPLEMENTARY pkgs usually would be
259# removed here, the new COMPLEMENTARY ones would be installed in the next
260# step.
261# 3) The COMPLEMENTARY would always be installed since it is
262# generated based on the second step's image.
263#
246# the following shell variables needs to be set before calling this func: 264# the following shell variables needs to be set before calling this func:
247# INSTALL_ROOTFS_RPM - install root dir 265# INSTALL_ROOTFS_RPM - install root dir
248# INSTALL_PLATFORM_RPM - main platform 266# INSTALL_PLATFORM_RPM - main platform
@@ -496,10 +514,10 @@ EOF
496 sort ${target_rootfs}/install/original_solution.manifest > ${target_rootfs}/install/original_solution_sorted.manifest 514 sort ${target_rootfs}/install/original_solution.manifest > ${target_rootfs}/install/original_solution_sorted.manifest
497 sort ${target_rootfs}/install/total_solution.manifest > ${target_rootfs}/install/total_solution_sorted.manifest 515 sort ${target_rootfs}/install/total_solution.manifest > ${target_rootfs}/install/total_solution_sorted.manifest
498 comm -2 -3 ${target_rootfs}/install/total_solution_sorted.manifest \ 516 comm -2 -3 ${target_rootfs}/install/total_solution_sorted.manifest \
499 ${target_rootfs}/install/original_solution_sorted.manifest | awk '{print $1}' > \ 517 ${target_rootfs}/install/original_solution_sorted.manifest > \
500 ${target_rootfs}/install/diff.manifest 518 ${target_rootfs}/install/diff.manifest
501 mv ${target_rootfs}/install/diff.manifest ${target_rootfs}/install/total_solution.manifest 519 mv ${target_rootfs}/install/diff.manifest ${target_rootfs}/install/total_solution.manifest
502 elif [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f "$pre_btmanifest" ]; then 520 elif [ "${INC_RPM_IMAGE_GEN}" = "1" -a -d "${target_rootfs}${rpmlibdir}" ]; then
503 echo "Skipping pre install due to existing image" 521 echo "Skipping pre install due to existing image"
504 else 522 else
505 # RPM is special. It can't handle dependencies and preinstall scripts correctly. Its 523 # RPM is special. It can't handle dependencies and preinstall scripts correctly. Its