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