blob: 0726a18b9167ff74a60be27cfb5189b19eac39f4 [file] [log] [blame]
Andrew Geissler635e0e42020-08-21 15:58:33 -05001#
Patrick Williams92b42cb2022-09-03 06:53:57 -05002# Copyright OpenEmbedded Contributors
3#
Andrew Geissler635e0e42020-08-21 15:58:33 -05004# 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
Andrew Geissler6ce62a22020-11-30 19:58:47 -060011from oe.package_manager.rpm.manifest import PkgManifest
Andrew Geissler635e0e42020-08-21 15:58:33 -050012from oe.package_manager.rpm import RpmPM
13
Andrew Geissler6ce62a22020-11-30 19:58:47 -060014class PkgSdk(Sdk):
Andrew Geissler635e0e42020-08-21 15:58:33 -050015 def __init__(self, d, manifest_dir=None, rpm_workdir="oe-sdk-repo"):
Andrew Geissler6ce62a22020-11-30 19:58:47 -060016 super(PkgSdk, self).__init__(d, manifest_dir)
Andrew Geissler635e0e42020-08-21 15:58:33 -050017
Andrew Geissler6ce62a22020-11-30 19:58:47 -060018 self.target_manifest = PkgManifest(d, self.manifest_dir,
Andrew Geissler635e0e42020-08-21 15:58:33 -050019 Manifest.MANIFEST_TYPE_SDK_TARGET)
Andrew Geissler6ce62a22020-11-30 19:58:47 -060020 self.host_manifest = PkgManifest(d, self.manifest_dir,
Andrew Geissler635e0e42020-08-21 15:58:33 -050021 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 self.target_pm.run_intercepts(populate_sdk='target')
71
72 execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND"))
73
74 if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d):
75 self.target_pm.remove_packaging_data()
76
77 bb.note("Installing NATIVESDK packages")
78 self._populate_sysroot(self.host_pm, self.host_manifest)
79 self.install_locales(self.host_pm)
80
81 self.host_pm.run_intercepts(populate_sdk='host')
82
83 execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_HOST_COMMAND"))
84
85 if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d):
86 self.host_pm.remove_packaging_data()
87
88 # Move host RPM library data
89 native_rpm_state_dir = os.path.join(self.sdk_output,
90 self.sdk_native_path,
91 self.d.getVar('localstatedir_nativesdk').strip('/'),
92 "lib",
93 "rpm"
94 )
95 self.mkdirhier(native_rpm_state_dir)
96 for f in glob.glob(os.path.join(self.sdk_output,
97 "var",
98 "lib",
99 "rpm",
100 "*")):
101 self.movefile(f, native_rpm_state_dir)
102
103 self.remove(os.path.join(self.sdk_output, "var"), True)
104
105 # Move host sysconfig data
106 native_sysconf_dir = os.path.join(self.sdk_output,
107 self.sdk_native_path,
108 self.d.getVar('sysconfdir',
109 True).strip('/'),
110 )
111 self.mkdirhier(native_sysconf_dir)
112 for f in glob.glob(os.path.join(self.sdk_output, "etc", "rpm*")):
113 self.movefile(f, native_sysconf_dir)
114 for f in glob.glob(os.path.join(self.sdk_output, "etc", "dnf", "*")):
115 self.movefile(f, native_sysconf_dir)
116 self.remove(os.path.join(self.sdk_output, "etc"), True)