def get_package_manager(d, root_path): """ Returns an OE package manager that can install packages in root_path. """ from oe.package_manager.rpm import RpmPM from oe.package_manager.ipk import OpkgPM from oe.package_manager.deb import DpkgPM pkg_class = d.getVar("IMAGE_PKGTYPE") if pkg_class == "rpm": pm = RpmPM(d, root_path, d.getVar('TARGET_VENDOR'), filterbydependencies=False) pm.create_configs() elif pkg_class == "ipk": pm = OpkgPM(d, root_path, d.getVar("IPKGCONF_TARGET"), d.getVar("ALL_MULTILIB_PACKAGE_ARCHS"), filterbydependencies=False) elif pkg_class == "deb": pm = DpkgPM(d, root_path, d.getVar('PACKAGE_ARCHS'), d.getVar('DPKG_ARCH'), filterbydependencies=False) pm.write_index() pm.update() return pm
def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"): super(PkgSdk, self).__init__(d, manifest_dir) self.target_manifest = PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET) self.host_manifest = PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST) rpm_repo_workdir = "oe-sdk-repo" if "sdk_ext" in d.getVar("BB_RUNTASK"): rpm_repo_workdir = "oe-sdk-ext-repo" self.target_pm = RpmPM(d, self.sdk_target_sysroot, self.d.getVar('TARGET_VENDOR'), 'target', rpm_repo_workdir=rpm_repo_workdir ) self.host_pm = RpmPM(d, self.sdk_host_sysroot, self.d.getVar('SDK_VENDOR'), 'host', "SDK_PACKAGE_ARCHS", "SDK_OS", rpm_repo_workdir=rpm_repo_workdir )
def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None): super(PkgRootfs, 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 = PkgManifest(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()
class PkgRootfs(Rootfs): def __init__(self, d, manifest_dir, progress_reporter=None, logcatcher=None): super(PkgRootfs, 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 = PkgManifest(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 PkgSdk(Sdk): def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"): super(PkgSdk, self).__init__(d, manifest_dir) self.target_manifest = PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_TARGET) self.host_manifest = PkgManifest(d, self.manifest_dir, Manifest.MANIFEST_TYPE_SDK_HOST) rpm_repo_workdir = "oe-sdk-repo" if "sdk_ext" in d.getVar("BB_RUNTASK"): rpm_repo_workdir = "oe-sdk-ext-repo" self.target_pm = RpmPM(d, self.sdk_target_sysroot, self.d.getVar('TARGET_VENDOR'), 'target', rpm_repo_workdir=rpm_repo_workdir ) self.host_pm = RpmPM(d, self.sdk_host_sysroot, self.d.getVar('SDK_VENDOR'), 'host', "SDK_PACKAGE_ARCHS", "SDK_OS", rpm_repo_workdir=rpm_repo_workdir ) def _populate_sysroot(self, pm, manifest): pkgs_to_install = manifest.parse_initial_manifest() pm.create_configs() pm.write_index() 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] pm.install(pkgs) pm.install(pkgs_attempt, True) def _populate(self): execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_PRE_TARGET_COMMAND")) bb.note("Installing TARGET packages") self._populate_sysroot(self.target_pm, self.target_manifest) self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) self.target_pm.run_intercepts(populate_sdk='target') execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): self.target_pm.remove_packaging_data() bb.note("Installing NATIVESDK packages") self._populate_sysroot(self.host_pm, self.host_manifest) self.install_locales(self.host_pm) self.host_pm.run_intercepts(populate_sdk='host') execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_HOST_COMMAND")) if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): self.host_pm.remove_packaging_data() # Move host RPM library data native_rpm_state_dir = os.path.join(self.sdk_output, self.sdk_native_path, self.d.getVar('localstatedir_nativesdk').strip('/'), "lib", "rpm" ) self.mkdirhier(native_rpm_state_dir) for f in glob.glob(os.path.join(self.sdk_output, "var", "lib", "rpm", "*")): self.movefile(f, native_rpm_state_dir) self.remove(os.path.join(self.sdk_output, "var"), True) # Move host sysconfig data native_sysconf_dir = os.path.join(self.sdk_output, self.sdk_native_path, self.d.getVar('sysconfdir', True).strip('/'), ) self.mkdirhier(native_sysconf_dir) for f in glob.glob(os.path.join(self.sdk_output, "etc", "rpm*")): self.movefile(f, native_sysconf_dir) for f in glob.glob(os.path.join(self.sdk_output, "etc", "dnf", "*")): self.movefile(f, native_sysconf_dir) self.remove(os.path.join(self.sdk_output, "etc"), True)