xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oe/package_manager/rpm/sdk.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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