1# 2# SPDX-License-Identifier: GPL-2.0-only 3# 4 5import glob 6from oe.utils import execute_pre_post_process 7from oe.sdk import Sdk 8from oe.manifest import Manifest 9from oe.package_manager.rpm.manifest import PkgManifest 10from oe.package_manager.rpm import RpmPM 11 12class PkgSdk(Sdk): 13 def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"): 14 super(PkgSdk, self).__init__(d, manifest_dir) 15 16 self.target_manifest = PkgManifest(d, self.manifest_dir, 17 Manifest.MANIFEST_TYPE_SDK_TARGET) 18 self.host_manifest = PkgManifest(d, self.manifest_dir, 19 Manifest.MANIFEST_TYPE_SDK_HOST) 20 21 rpm_repo_workdir = "oe-sdk-repo" 22 if "sdk_ext" in d.getVar("BB_RUNTASK"): 23 rpm_repo_workdir = "oe-sdk-ext-repo" 24 25 self.target_pm = RpmPM(d, 26 self.sdk_target_sysroot, 27 self.d.getVar('TARGET_VENDOR'), 28 'target', 29 rpm_repo_workdir=rpm_repo_workdir 30 ) 31 32 self.host_pm = RpmPM(d, 33 self.sdk_host_sysroot, 34 self.d.getVar('SDK_VENDOR'), 35 'host', 36 "SDK_PACKAGE_ARCHS", 37 "SDK_OS", 38 rpm_repo_workdir=rpm_repo_workdir 39 ) 40 41 def _populate_sysroot(self, pm, manifest): 42 pkgs_to_install = manifest.parse_initial_manifest() 43 44 pm.create_configs() 45 pm.write_index() 46 pm.update() 47 48 pkgs = [] 49 pkgs_attempt = [] 50 for pkg_type in pkgs_to_install: 51 if pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY: 52 pkgs_attempt += pkgs_to_install[pkg_type] 53 else: 54 pkgs += pkgs_to_install[pkg_type] 55 56 pm.install(pkgs) 57 58 pm.install(pkgs_attempt, True) 59 60 def _populate(self): 61 execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_PRE_TARGET_COMMAND")) 62 63 bb.note("Installing TARGET packages") 64 self._populate_sysroot(self.target_pm, self.target_manifest) 65 66 self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) 67 68 self.target_pm.run_intercepts(populate_sdk='target') 69 70 execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) 71 72 if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): 73 self.target_pm.remove_packaging_data() 74 75 bb.note("Installing NATIVESDK packages") 76 self._populate_sysroot(self.host_pm, self.host_manifest) 77 self.install_locales(self.host_pm) 78 79 self.host_pm.run_intercepts(populate_sdk='host') 80 81 execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_HOST_COMMAND")) 82 83 if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): 84 self.host_pm.remove_packaging_data() 85 86 # Move host RPM library data 87 native_rpm_state_dir = os.path.join(self.sdk_output, 88 self.sdk_native_path, 89 self.d.getVar('localstatedir_nativesdk').strip('/'), 90 "lib", 91 "rpm" 92 ) 93 self.mkdirhier(native_rpm_state_dir) 94 for f in glob.glob(os.path.join(self.sdk_output, 95 "var", 96 "lib", 97 "rpm", 98 "*")): 99 self.movefile(f, native_rpm_state_dir) 100 101 self.remove(os.path.join(self.sdk_output, "var"), True) 102 103 # Move host sysconfig data 104 native_sysconf_dir = os.path.join(self.sdk_output, 105 self.sdk_native_path, 106 self.d.getVar('sysconfdir', 107 True).strip('/'), 108 ) 109 self.mkdirhier(native_sysconf_dir) 110 for f in glob.glob(os.path.join(self.sdk_output, "etc", "rpm*")): 111 self.movefile(f, native_sysconf_dir) 112 for f in glob.glob(os.path.join(self.sdk_output, "etc", "dnf", "*")): 113 self.movefile(f, native_sysconf_dir) 114 self.remove(os.path.join(self.sdk_output, "etc"), True) 115