mirror of
https://git.yoctoproject.org/poky
synced 2026-02-26 19:39:40 +01:00
classes/image: ensure uninstalled packages do not appear in manifests
Since the rewrite of the image construction code in python a few releases ago, we remove a couple of packages from the image as one of the final steps when constructing the image (notably update-rc.d and run-postinsts). However, because of the order of operations, these packages are still listed both in the buildhistory installed_package*.txt files and in the manifest file created next to the image, which is wrong. There were two possible solutions to this: (1) change the order such that the uninstallation occurs before calling ROOTFS_POSTPROCESS_COMMAND or (2) add another hook variable in such that we can have the package list collection code run at the right time. Because it's currently possible (but very much not recommended) to install additional packages within ROOTFS_POSTPROCESS_COMMAND, which may have postinstall scripts and thus require the packages we would otherwise uninstall if we were to take option 1, option 2 is really the least likely to cause problems. Therefore, add ROOTFS_POSTUNINSTALL_COMMAND and make the image and buildhistory classes use it. Fixes [YOCTO #6479]. (From OE-Core rev: b198a189228648057c3be7d068598f50841b3bf9) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
69c588b66d
commit
26e5b0f7b9
@@ -484,8 +484,9 @@ END
|
||||
echo "SDKSIZE = $sdksize" >> ${BUILDHISTORY_DIR_SDK}/sdk-info.txt
|
||||
}
|
||||
|
||||
# By prepending we get in before the removal of packaging files
|
||||
ROOTFS_POSTPROCESS_COMMAND =+ " buildhistory_list_installed_image ;\
|
||||
# By using ROOTFS_POSTUNINSTALL_COMMAND we get in after uninstallation of
|
||||
# unneeded packages but before the removal of packaging files
|
||||
ROOTFS_POSTUNINSTALL_COMMAND += " buildhistory_list_installed_image ;\
|
||||
buildhistory_get_image_installed ; "
|
||||
|
||||
IMAGE_POSTPROCESS_COMMAND += " buildhistory_get_imageinfo ; "
|
||||
|
||||
@@ -167,7 +167,7 @@ ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "debug-twe
|
||||
ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "debug-tweaks", "postinst_enable_logging; ", "",d)}'
|
||||
# Write manifest
|
||||
IMAGE_MANIFEST = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.manifest"
|
||||
ROOTFS_POSTPROCESS_COMMAND =+ "write_image_manifest ; "
|
||||
ROOTFS_POSTUNINSTALL_COMMAND =+ "write_image_manifest ; "
|
||||
# Set default postinst log file
|
||||
POSTINST_LOGFILE ?= "${localstatedir}/log/postinstall.log"
|
||||
# Set default target for systemd images
|
||||
|
||||
@@ -137,34 +137,39 @@ class Rootfs(object):
|
||||
self.d.getVar('IMAGE_ROOTFS', True),
|
||||
"run-postinsts", "remove"])
|
||||
|
||||
# Remove unneeded package-management related components
|
||||
if bb.utils.contains("IMAGE_FEATURES", "package-management",
|
||||
True, False, self.d):
|
||||
return
|
||||
runtime_pkgmanage = bb.utils.contains("IMAGE_FEATURES", "package-management",
|
||||
True, False, self.d)
|
||||
if not runtime_pkgmanage:
|
||||
# Remove components that we don't need if we're not going to install
|
||||
# additional packages at runtime
|
||||
if delayed_postinsts is None:
|
||||
installed_pkgs_dir = self.d.expand('${WORKDIR}/installed_pkgs.txt')
|
||||
pkgs_to_remove = list()
|
||||
with open(installed_pkgs_dir, "r+") as installed_pkgs:
|
||||
pkgs_installed = installed_pkgs.read().split('\n')
|
||||
for pkg_installed in pkgs_installed[:]:
|
||||
pkg = pkg_installed.split()[0]
|
||||
if pkg in ["update-rc.d",
|
||||
"base-passwd",
|
||||
self.d.getVar("ROOTFS_BOOTSTRAP_INSTALL", True)
|
||||
]:
|
||||
pkgs_to_remove.append(pkg)
|
||||
pkgs_installed.remove(pkg_installed)
|
||||
|
||||
if delayed_postinsts is None:
|
||||
installed_pkgs_dir = self.d.expand('${WORKDIR}/installed_pkgs.txt')
|
||||
pkgs_to_remove = list()
|
||||
with open(installed_pkgs_dir, "r+") as installed_pkgs:
|
||||
pkgs_installed = installed_pkgs.read().split('\n')
|
||||
for pkg_installed in pkgs_installed[:]:
|
||||
pkg = pkg_installed.split()[0]
|
||||
if pkg in ["update-rc.d",
|
||||
"base-passwd",
|
||||
self.d.getVar("ROOTFS_BOOTSTRAP_INSTALL", True)
|
||||
]:
|
||||
pkgs_to_remove.append(pkg)
|
||||
pkgs_installed.remove(pkg_installed)
|
||||
if len(pkgs_to_remove) > 0:
|
||||
self.pm.remove(pkgs_to_remove, False)
|
||||
# Update installed_pkgs.txt
|
||||
open(installed_pkgs_dir, "w+").write('\n'.join(pkgs_installed))
|
||||
|
||||
if len(pkgs_to_remove) > 0:
|
||||
self.pm.remove(pkgs_to_remove, False)
|
||||
# Update installed_pkgs.txt
|
||||
open(installed_pkgs_dir, "w+").write('\n'.join(pkgs_installed))
|
||||
else:
|
||||
self._save_postinsts()
|
||||
|
||||
else:
|
||||
self._save_postinsts()
|
||||
post_uninstall_cmds = self.d.getVar("ROOTFS_POSTUNINSTALL_COMMAND", True)
|
||||
execute_pre_post_process(self.d, post_uninstall_cmds)
|
||||
|
||||
self.pm.remove_packaging_data()
|
||||
if not runtime_pkgmanage:
|
||||
# Remove the package manager data files
|
||||
self.pm.remove_packaging_data()
|
||||
|
||||
def _run_intercepts(self):
|
||||
intercepts_dir = os.path.join(self.d.getVar('WORKDIR', True),
|
||||
|
||||
Reference in New Issue
Block a user