mirror of
https://git.yoctoproject.org/poky
synced 2026-04-20 09:32:13 +02:00
rpm: Move rootfs to its own dir
This is a part of a refactor that will split the package manager code so that it's possible to use other package managers in other layers. (From OE-Core rev: e4f07444276a88f336d5fe5e60688fcfb2f22df7) Signed-off-by: Fredrik Gustafsson <fredrigu@axis.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
9129dfe523
commit
b8d3d22ccd
148
meta/lib/oe/package_manager/rpm/rootfs.py
Normal file
148
meta/lib/oe/package_manager/rpm/rootfs.py
Normal file
@@ -0,0 +1,148 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
|
||||
from oe.rootfs import Rootfs
|
||||
from oe.package_manager import RpmPM
|
||||
from oe.manifest import Manifest
|
||||
from oe.utils import execute_pre_post_process
|
||||
from oe.package_manager.rpm.manifest import RpmManifest
|
||||
|
||||
class RpmRootfs(Rootfs):
|
||||
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None):
|
||||
super(RpmRootfs, self).__init__(d, progress_reporter, logcatcher)
|
||||
self.log_check_regex = r'(unpacking of archive failed|Cannot find package'\
|
||||
r'|exit 1|ERROR: |Error: |Error |ERROR '\
|
||||
r'|Failed |Failed: |Failed$|Failed\(\d+\):)'
|
||||
|
||||
self.manifest = RpmManifest(d, manifest_dir)
|
||||
|
||||
self.pm = RpmPM(d,
|
||||
d.getVar('IMAGE_ROOTFS'),
|
||||
self.d.getVar('TARGET_VENDOR')
|
||||
)
|
||||
|
||||
self.inc_rpm_image_gen = self.d.getVar('INC_RPM_IMAGE_GEN')
|
||||
if self.inc_rpm_image_gen != "1":
|
||||
bb.utils.remove(self.image_rootfs, True)
|
||||
else:
|
||||
self.pm.recovery_packaging_data()
|
||||
bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True)
|
||||
|
||||
self.pm.create_configs()
|
||||
|
||||
'''
|
||||
While rpm incremental image generation is enabled, it will remove the
|
||||
unneeded pkgs by comparing the new install solution manifest and the
|
||||
old installed manifest.
|
||||
'''
|
||||
def _create_incremental(self, pkgs_initial_install):
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
|
||||
pkgs_to_install = list()
|
||||
for pkg_type in pkgs_initial_install:
|
||||
pkgs_to_install += pkgs_initial_install[pkg_type]
|
||||
|
||||
installed_manifest = self.pm.load_old_install_solution()
|
||||
solution_manifest = self.pm.dump_install_solution(pkgs_to_install)
|
||||
|
||||
pkg_to_remove = list()
|
||||
for pkg in installed_manifest:
|
||||
if pkg not in solution_manifest:
|
||||
pkg_to_remove.append(pkg)
|
||||
|
||||
self.pm.update()
|
||||
|
||||
bb.note('incremental update -- upgrade packages in place ')
|
||||
self.pm.upgrade()
|
||||
if pkg_to_remove != []:
|
||||
bb.note('incremental removed: %s' % ' '.join(pkg_to_remove))
|
||||
self.pm.remove(pkg_to_remove)
|
||||
|
||||
self.pm.autoremove()
|
||||
|
||||
def _create(self):
|
||||
pkgs_to_install = self.manifest.parse_initial_manifest()
|
||||
rpm_pre_process_cmds = self.d.getVar('RPM_PREPROCESS_COMMANDS')
|
||||
rpm_post_process_cmds = self.d.getVar('RPM_POSTPROCESS_COMMANDS')
|
||||
|
||||
# update PM index files
|
||||
self.pm.write_index()
|
||||
|
||||
execute_pre_post_process(self.d, rpm_pre_process_cmds)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
self._create_incremental(pkgs_to_install)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.update()
|
||||
|
||||
pkgs = []
|
||||
pkgs_attempt = []
|
||||
for pkg_type in pkgs_to_install:
|
||||
if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY:
|
||||
pkgs_attempt += pkgs_to_install[pkg_type]
|
||||
else:
|
||||
pkgs += pkgs_to_install[pkg_type]
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install(pkgs)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install(pkgs_attempt, True)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install_complementary()
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self._setup_dbg_rootfs(['/etc', '/var/lib/rpm', '/var/cache/dnf', '/var/lib/dnf'])
|
||||
|
||||
execute_pre_post_process(self.d, rpm_post_process_cmds)
|
||||
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
self.pm.backup_packaging_data()
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
|
||||
@staticmethod
|
||||
def _depends_list():
|
||||
return ['DEPLOY_DIR_RPM', 'INC_RPM_IMAGE_GEN', 'RPM_PREPROCESS_COMMANDS',
|
||||
'RPM_POSTPROCESS_COMMANDS', 'RPM_PREFER_ELF_ARCH']
|
||||
|
||||
def _get_delayed_postinsts(self):
|
||||
postinst_dir = self.d.expand("${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts")
|
||||
if os.path.isdir(postinst_dir):
|
||||
files = os.listdir(postinst_dir)
|
||||
for f in files:
|
||||
bb.note('Delayed package scriptlet: %s' % f)
|
||||
return files
|
||||
|
||||
return None
|
||||
|
||||
def _save_postinsts(self):
|
||||
# this is just a stub. For RPM, the failed postinstalls are
|
||||
# already saved in /etc/rpm-postinsts
|
||||
pass
|
||||
|
||||
def _log_check(self):
|
||||
self._log_check_warn()
|
||||
self._log_check_error()
|
||||
|
||||
def _cleanup(self):
|
||||
if bb.utils.contains("IMAGE_FEATURES", "package-management", True, False, self.d):
|
||||
self.pm._invoke_dnf(["clean", "all"])
|
||||
@@ -355,146 +355,6 @@ class Rootfs(object, metaclass=ABCMeta):
|
||||
self.image_rootfs, "-D", devtable])
|
||||
|
||||
|
||||
class RpmRootfs(Rootfs):
|
||||
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None):
|
||||
super(RpmRootfs, self).__init__(d, progress_reporter, logcatcher)
|
||||
self.log_check_regex = r'(unpacking of archive failed|Cannot find package'\
|
||||
r'|exit 1|ERROR: |Error: |Error |ERROR '\
|
||||
r'|Failed |Failed: |Failed$|Failed\(\d+\):)'
|
||||
|
||||
self.manifest = RpmManifest(d, manifest_dir)
|
||||
|
||||
self.pm = RpmPM(d,
|
||||
d.getVar('IMAGE_ROOTFS'),
|
||||
self.d.getVar('TARGET_VENDOR')
|
||||
)
|
||||
|
||||
self.inc_rpm_image_gen = self.d.getVar('INC_RPM_IMAGE_GEN')
|
||||
if self.inc_rpm_image_gen != "1":
|
||||
bb.utils.remove(self.image_rootfs, True)
|
||||
else:
|
||||
self.pm.recovery_packaging_data()
|
||||
bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True)
|
||||
|
||||
self.pm.create_configs()
|
||||
|
||||
'''
|
||||
While rpm incremental image generation is enabled, it will remove the
|
||||
unneeded pkgs by comparing the new install solution manifest and the
|
||||
old installed manifest.
|
||||
'''
|
||||
def _create_incremental(self, pkgs_initial_install):
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
|
||||
pkgs_to_install = list()
|
||||
for pkg_type in pkgs_initial_install:
|
||||
pkgs_to_install += pkgs_initial_install[pkg_type]
|
||||
|
||||
installed_manifest = self.pm.load_old_install_solution()
|
||||
solution_manifest = self.pm.dump_install_solution(pkgs_to_install)
|
||||
|
||||
pkg_to_remove = list()
|
||||
for pkg in installed_manifest:
|
||||
if pkg not in solution_manifest:
|
||||
pkg_to_remove.append(pkg)
|
||||
|
||||
self.pm.update()
|
||||
|
||||
bb.note('incremental update -- upgrade packages in place ')
|
||||
self.pm.upgrade()
|
||||
if pkg_to_remove != []:
|
||||
bb.note('incremental removed: %s' % ' '.join(pkg_to_remove))
|
||||
self.pm.remove(pkg_to_remove)
|
||||
|
||||
self.pm.autoremove()
|
||||
|
||||
def _create(self):
|
||||
pkgs_to_install = self.manifest.parse_initial_manifest()
|
||||
rpm_pre_process_cmds = self.d.getVar('RPM_PREPROCESS_COMMANDS')
|
||||
rpm_post_process_cmds = self.d.getVar('RPM_POSTPROCESS_COMMANDS')
|
||||
|
||||
# update PM index files
|
||||
self.pm.write_index()
|
||||
|
||||
execute_pre_post_process(self.d, rpm_pre_process_cmds)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
self._create_incremental(pkgs_to_install)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.update()
|
||||
|
||||
pkgs = []
|
||||
pkgs_attempt = []
|
||||
for pkg_type in pkgs_to_install:
|
||||
if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY:
|
||||
pkgs_attempt += pkgs_to_install[pkg_type]
|
||||
else:
|
||||
pkgs += pkgs_to_install[pkg_type]
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install(pkgs)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install(pkgs_attempt, True)
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self.pm.install_complementary()
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
self._setup_dbg_rootfs(['/etc', '/var/lib/rpm', '/var/cache/dnf', '/var/lib/dnf'])
|
||||
|
||||
execute_pre_post_process(self.d, rpm_post_process_cmds)
|
||||
|
||||
if self.inc_rpm_image_gen == "1":
|
||||
self.pm.backup_packaging_data()
|
||||
|
||||
if self.progress_reporter:
|
||||
self.progress_reporter.next_stage()
|
||||
|
||||
|
||||
@staticmethod
|
||||
def _depends_list():
|
||||
return ['DEPLOY_DIR_RPM', 'INC_RPM_IMAGE_GEN', 'RPM_PREPROCESS_COMMANDS',
|
||||
'RPM_POSTPROCESS_COMMANDS', 'RPM_PREFER_ELF_ARCH']
|
||||
|
||||
def _get_delayed_postinsts(self):
|
||||
postinst_dir = self.d.expand("${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts")
|
||||
if os.path.isdir(postinst_dir):
|
||||
files = os.listdir(postinst_dir)
|
||||
for f in files:
|
||||
bb.note('Delayed package scriptlet: %s' % f)
|
||||
return files
|
||||
|
||||
return None
|
||||
|
||||
def _save_postinsts(self):
|
||||
# this is just a stub. For RPM, the failed postinstalls are
|
||||
# already saved in /etc/rpm-postinsts
|
||||
pass
|
||||
|
||||
def _log_check(self):
|
||||
self._log_check_warn()
|
||||
self._log_check_error()
|
||||
|
||||
def _cleanup(self):
|
||||
if bb.utils.contains("IMAGE_FEATURES", "package-management", True, False, self.d):
|
||||
self.pm._invoke_dnf(["clean", "all"])
|
||||
|
||||
|
||||
class DpkgOpkgRootfs(Rootfs):
|
||||
def __init__(self, d, progress_reporter=None, logcatcher=None):
|
||||
super(DpkgOpkgRootfs, self).__init__(d, progress_reporter, logcatcher)
|
||||
@@ -961,6 +821,7 @@ class OpkgRootfs(DpkgOpkgRootfs):
|
||||
self.pm.remove_lists()
|
||||
|
||||
def get_class_for_type(imgtype):
|
||||
from oe.package_manager.rpm.rootfs import RpmRootfs
|
||||
return {"rpm": RpmRootfs,
|
||||
"ipk": OpkgRootfs,
|
||||
"deb": DpkgRootfs}[imgtype]
|
||||
@@ -973,6 +834,7 @@ def variable_depends(d, manifest_dir=None):
|
||||
def create_rootfs(d, manifest_dir=None, progress_reporter=None, logcatcher=None):
|
||||
env_bkp = os.environ.copy()
|
||||
|
||||
from oe.package_manager.rpm.rootfs import RpmRootfs
|
||||
img_type = d.getVar('IMAGE_PKGTYPE')
|
||||
if img_type == "rpm":
|
||||
RpmRootfs(d, manifest_dir, progress_reporter, logcatcher).create()
|
||||
|
||||
Reference in New Issue
Block a user