blob: 3f27164536769eb0740975eceab4f2c2d9bf8baa [file] [log] [blame]
Brad Bishopc342db32019-05-15 21:57:59 -04001#
Patrick Williams92b42cb2022-09-03 06:53:57 -05002# Copyright OpenEmbedded Contributors
3#
Brad Bishopc342db32019-05-15 21:57:59 -04004# SPDX-License-Identifier: GPL-2.0-only
5#
Patrick Williamsc124f4f2015-09-15 14:41:29 -05006from abc import ABCMeta, abstractmethod
7from oe.utils import execute_pre_post_process
8from oe.package_manager import *
9from oe.manifest import *
10import oe.path
Patrick Williamsc124f4f2015-09-15 14:41:29 -050011import shutil
12import os
13import subprocess
14import re
Patrick Williamsc124f4f2015-09-15 14:41:29 -050015
Patrick Williamsc0f7c042017-02-23 20:41:17 -060016class Rootfs(object, metaclass=ABCMeta):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050017 """
18 This is an abstract class. Do not instantiate this directly.
19 """
Patrick Williamsc124f4f2015-09-15 14:41:29 -050020
Brad Bishop6e60e8b2018-02-01 10:27:11 -050021 def __init__(self, d, progress_reporter=None, logcatcher=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050022 self.d = d
23 self.pm = None
Brad Bishop6e60e8b2018-02-01 10:27:11 -050024 self.image_rootfs = self.d.getVar('IMAGE_ROOTFS')
25 self.deploydir = self.d.getVar('IMGDEPLOYDIR')
Patrick Williamsc0f7c042017-02-23 20:41:17 -060026 self.progress_reporter = progress_reporter
Brad Bishop6e60e8b2018-02-01 10:27:11 -050027 self.logcatcher = logcatcher
Patrick Williamsc124f4f2015-09-15 14:41:29 -050028
29 self.install_order = Manifest.INSTALL_ORDER
30
31 @abstractmethod
32 def _create(self):
33 pass
34
35 @abstractmethod
36 def _get_delayed_postinsts(self):
37 pass
38
39 @abstractmethod
40 def _save_postinsts(self):
41 pass
42
43 @abstractmethod
44 def _log_check(self):
45 pass
46
Patrick Williamsc0f7c042017-02-23 20:41:17 -060047 def _log_check_common(self, type, match):
48 # Ignore any lines containing log_check to avoid recursion, and ignore
49 # lines beginning with a + since sh -x may emit code which isn't
50 # actually executed, but may contain error messages
51 excludes = [ 'log_check', r'^\+' ]
52 if hasattr(self, 'log_check_expected_regexes'):
53 excludes.extend(self.log_check_expected_regexes)
Andrew Geissler4c19ea12020-10-27 13:52:24 -050054 # Insert custom log_check excludes
55 excludes += [x for x in (self.d.getVar("IMAGE_LOG_CHECK_EXCLUDES") or "").split(" ") if x]
Patrick Williamsc0f7c042017-02-23 20:41:17 -060056 excludes = [re.compile(x) for x in excludes]
57 r = re.compile(match)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050058 log_path = self.d.expand("${T}/log.do_rootfs")
Patrick Williamsc0f7c042017-02-23 20:41:17 -060059 messages = []
Patrick Williamsc124f4f2015-09-15 14:41:29 -050060 with open(log_path, 'r') as log:
61 for line in log:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050062 if self.logcatcher and self.logcatcher.contains(line.rstrip()):
63 continue
Patrick Williamsc0f7c042017-02-23 20:41:17 -060064 for ee in excludes:
65 m = ee.search(line)
66 if m:
67 break
68 if m:
Patrick Williamsc124f4f2015-09-15 14:41:29 -050069 continue
70
71 m = r.search(line)
72 if m:
Patrick Williamsc0f7c042017-02-23 20:41:17 -060073 messages.append('[log_check] %s' % line)
74 if messages:
75 if len(messages) == 1:
76 msg = '1 %s message' % type
77 else:
78 msg = '%d %s messages' % (len(messages), type)
79 msg = '[log_check] %s: found %s in the logfile:\n%s' % \
Brad Bishop6e60e8b2018-02-01 10:27:11 -050080 (self.d.getVar('PN'), msg, ''.join(messages))
Patrick Williamsc0f7c042017-02-23 20:41:17 -060081 if type == 'error':
82 bb.fatal(msg)
83 else:
84 bb.warn(msg)
85
86 def _log_check_warn(self):
87 self._log_check_common('warning', '^(warn|Warn|WARNING:)')
Patrick Williamsc124f4f2015-09-15 14:41:29 -050088
89 def _log_check_error(self):
Patrick Williamsc0f7c042017-02-23 20:41:17 -060090 self._log_check_common('error', self.log_check_regex)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050091
92 def _insert_feed_uris(self):
93 if bb.utils.contains("IMAGE_FEATURES", "package-management",
94 True, False, self.d):
Brad Bishop6e60e8b2018-02-01 10:27:11 -050095 self.pm.insert_feeds_uris(self.d.getVar('PACKAGE_FEED_URIS') or "",
96 self.d.getVar('PACKAGE_FEED_BASE_PATHS') or "",
97 self.d.getVar('PACKAGE_FEED_ARCHS'))
98
Patrick Williamsc124f4f2015-09-15 14:41:29 -050099
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500100 """
101 The _cleanup() method should be used to clean-up stuff that we don't really
102 want to end up on target. For example, in the case of RPM, the DB locks.
103 The method is called, once, at the end of create() method.
104 """
105 @abstractmethod
106 def _cleanup(self):
107 pass
108
Andrew Geissler8f840682023-07-21 09:09:43 -0500109 def _setup_dbg_rootfs(self, package_paths):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500110 gen_debugfs = self.d.getVar('IMAGE_GEN_DEBUGFS') or '0'
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500111 if gen_debugfs != '1':
112 return
113
114 bb.note(" Renaming the original rootfs...")
115 try:
116 shutil.rmtree(self.image_rootfs + '-orig')
117 except:
118 pass
Andrew Geisslerc926e172021-05-07 16:11:35 -0500119 bb.utils.rename(self.image_rootfs, self.image_rootfs + '-orig')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500120
121 bb.note(" Creating debug rootfs...")
122 bb.utils.mkdirhier(self.image_rootfs)
123
124 bb.note(" Copying back package database...")
Andrew Geissler8f840682023-07-21 09:09:43 -0500125 for path in package_paths:
126 bb.utils.mkdirhier(self.image_rootfs + os.path.dirname(path))
127 if os.path.isdir(self.image_rootfs + '-orig' + path):
128 shutil.copytree(self.image_rootfs + '-orig' + path, self.image_rootfs + path, symlinks=True)
129 elif os.path.isfile(self.image_rootfs + '-orig' + path):
130 shutil.copyfile(self.image_rootfs + '-orig' + path, self.image_rootfs + path)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500131
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500132 # Copy files located in /usr/lib/debug or /usr/src/debug
133 for dir in ["/usr/lib/debug", "/usr/src/debug"]:
134 src = self.image_rootfs + '-orig' + dir
Andrew Geissler82c905d2020-04-13 13:39:40 -0500135 if os.path.exists(src):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500136 dst = self.image_rootfs + dir
137 bb.utils.mkdirhier(os.path.dirname(dst))
138 shutil.copytree(src, dst)
139
140 # Copy files with suffix '.debug' or located in '.debug' dir.
Andrew Geissler82c905d2020-04-13 13:39:40 -0500141 for root, dirs, files in os.walk(self.image_rootfs + '-orig'):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500142 relative_dir = root[len(self.image_rootfs + '-orig'):]
143 for f in files:
144 if f.endswith('.debug') or '/.debug' in relative_dir:
145 bb.utils.mkdirhier(self.image_rootfs + relative_dir)
146 shutil.copy(os.path.join(root, f),
147 self.image_rootfs + relative_dir)
148
149 bb.note(" Install complementary '*-dbg' packages...")
150 self.pm.install_complementary('*-dbg')
151
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800152 if self.d.getVar('PACKAGE_DEBUG_SPLIT_STYLE') == 'debug-with-srcpkg':
153 bb.note(" Install complementary '*-src' packages...")
154 self.pm.install_complementary('*-src')
155
156 """
157 Install additional debug packages. Possibility to install additional packages,
158 which are not automatically installed as complementary package of
159 standard one, e.g. debug package of static libraries.
160 """
161 extra_debug_pkgs = self.d.getVar('IMAGE_INSTALL_DEBUGFS')
162 if extra_debug_pkgs:
163 bb.note(" Install extra debug packages...")
164 self.pm.install(extra_debug_pkgs.split(), True)
165
Andrew Geissler8f840682023-07-21 09:09:43 -0500166 bb.note(" Removing package database...")
167 for path in package_paths:
168 if os.path.isdir(self.image_rootfs + path):
169 shutil.rmtree(self.image_rootfs + path)
170 elif os.path.isfile(self.image_rootfs + path):
171 os.remove(self.image_rootfs + path)
172
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500173 bb.note(" Rename debug rootfs...")
174 try:
175 shutil.rmtree(self.image_rootfs + '-dbg')
176 except:
177 pass
Andrew Geisslerc926e172021-05-07 16:11:35 -0500178 bb.utils.rename(self.image_rootfs, self.image_rootfs + '-dbg')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500179
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700180 bb.note(" Restoring original rootfs...")
Andrew Geisslerc926e172021-05-07 16:11:35 -0500181 bb.utils.rename(self.image_rootfs + '-orig', self.image_rootfs)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500182
183 def _exec_shell_cmd(self, cmd):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500184 try:
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500185 subprocess.check_output(cmd, stderr=subprocess.STDOUT)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500186 except subprocess.CalledProcessError as e:
187 return("Command '%s' returned %d:\n%s" % (e.cmd, e.returncode, e.output))
188
189 return None
190
191 def create(self):
192 bb.note("###### Generate rootfs #######")
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500193 pre_process_cmds = self.d.getVar("ROOTFS_PREPROCESS_COMMAND")
194 post_process_cmds = self.d.getVar("ROOTFS_POSTPROCESS_COMMAND")
195 rootfs_post_install_cmds = self.d.getVar('ROOTFS_POSTINSTALL_COMMAND')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500196
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500197 execute_pre_post_process(self.d, pre_process_cmds)
198
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600199 if self.progress_reporter:
200 self.progress_reporter.next_stage()
201
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500202 # call the package manager dependent create method
203 self._create()
204
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500205 sysconfdir = self.image_rootfs + self.d.getVar('sysconfdir')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500206 bb.utils.mkdirhier(sysconfdir)
207 with open(sysconfdir + "/version", "w+") as ver:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500208 ver.write(self.d.getVar('BUILDNAME') + "\n")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500209
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500210 execute_pre_post_process(self.d, rootfs_post_install_cmds)
211
Brad Bishop316dfdd2018-06-25 12:45:53 -0400212 self.pm.run_intercepts()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500213
214 execute_pre_post_process(self.d, post_process_cmds)
215
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600216 if self.progress_reporter:
217 self.progress_reporter.next_stage()
218
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500219 if bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600220 True, False, self.d) and \
221 not bb.utils.contains("IMAGE_FEATURES",
222 "read-only-rootfs-delayed-postinsts",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500223 True, False, self.d):
224 delayed_postinsts = self._get_delayed_postinsts()
225 if delayed_postinsts is not None:
226 bb.fatal("The following packages could not be configured "
227 "offline and rootfs is read-only: %s" %
228 delayed_postinsts)
229
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500230 if self.d.getVar('USE_DEVFS') != "1":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500231 self._create_devfs()
232
233 self._uninstall_unneeded()
234
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600235 if self.progress_reporter:
236 self.progress_reporter.next_stage()
237
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500238 self._insert_feed_uris()
239
240 self._run_ldconfig()
241
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500242 if self.d.getVar('USE_DEPMOD') != "0":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500243 self._generate_kernel_module_deps()
244
245 self._cleanup()
246 self._log_check()
247
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600248 if self.progress_reporter:
249 self.progress_reporter.next_stage()
250
251
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500252 def _uninstall_unneeded(self):
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500253 # Remove the run-postinsts package if no delayed postinsts are found
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500254 delayed_postinsts = self._get_delayed_postinsts()
255 if delayed_postinsts is None:
Andrew Geissler5199d832021-09-24 16:47:35 -0500256 if os.path.exists(self.d.expand("${IMAGE_ROOTFS}${sysconfdir}/init.d/run-postinsts")) or os.path.exists(self.d.expand("${IMAGE_ROOTFS}${systemd_system_unitdir}/run-postinsts.service")):
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500257 self.pm.remove(["run-postinsts"])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500258
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500259 image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500260 True, False, self.d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500261 image_rorfs_force = self.d.getVar('FORCE_RO_REMOVE')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600262
263 if image_rorfs or image_rorfs_force == "1":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500264 # Remove components that we don't need if it's a read-only rootfs
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500265 unneeded_pkgs = self.d.getVar("ROOTFS_RO_UNNEEDED").split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500266 pkgs_installed = image_list_installed_packages(self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500267 # Make sure update-alternatives is removed last. This is
268 # because its database has to available while uninstalling
269 # other packages, allowing alternative symlinks of packages
270 # to be uninstalled or to be managed correctly otherwise.
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500271 provider = self.d.getVar("VIRTUAL-RUNTIME_update-alternatives")
272 pkgs_to_remove = sorted([pkg for pkg in pkgs_installed if pkg in unneeded_pkgs], key=lambda x: x == provider)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500273
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500274 # update-alternatives provider is removed in its own remove()
275 # call because all package managers do not guarantee the packages
276 # are removed in the order they given in the list (which is
277 # passed to the command line). The sorting done earlier is
278 # utilized to implement the 2-stage removal.
279 if len(pkgs_to_remove) > 1:
280 self.pm.remove(pkgs_to_remove[:-1], False)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500281 if len(pkgs_to_remove) > 0:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500282 self.pm.remove([pkgs_to_remove[-1]], False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500283
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500284 if delayed_postinsts:
285 self._save_postinsts()
286 if image_rorfs:
287 bb.warn("There are post install scripts "
288 "in a read-only rootfs")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500289
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500290 post_uninstall_cmds = self.d.getVar("ROOTFS_POSTUNINSTALL_COMMAND")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500291 execute_pre_post_process(self.d, post_uninstall_cmds)
292
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500293 runtime_pkgmanage = bb.utils.contains("IMAGE_FEATURES", "package-management",
294 True, False, self.d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500295 if not runtime_pkgmanage:
296 # Remove the package manager data files
297 self.pm.remove_packaging_data()
298
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500299 def _run_ldconfig(self):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500300 if self.d.getVar('LDCONFIGDEPEND'):
Andrew Geissler475cb722020-07-10 16:00:51 -0500301 bb.note("Executing: ldconfig -r " + self.image_rootfs + " -c new -v -X")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500302 self._exec_shell_cmd(['ldconfig', '-r', self.image_rootfs, '-c',
Andrew Geissler475cb722020-07-10 16:00:51 -0500303 'new', '-v', '-X'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500304
Patrick Williams213cb262021-08-07 19:21:33 -0500305 image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
306 True, False, self.d)
307 ldconfig_in_features = bb.utils.contains("DISTRO_FEATURES", "ldconfig",
308 True, False, self.d)
309 if image_rorfs or not ldconfig_in_features:
310 ldconfig_cache_dir = os.path.join(self.image_rootfs, "var/cache/ldconfig")
311 if os.path.exists(ldconfig_cache_dir):
312 bb.note("Removing ldconfig auxiliary cache...")
313 shutil.rmtree(ldconfig_cache_dir)
314
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500315 def _check_for_kernel_modules(self, modules_dir):
316 for root, dirs, files in os.walk(modules_dir, topdown=True):
317 for name in files:
Andrew Geissler78b72792022-06-14 06:47:25 -0500318 found_ko = name.endswith((".ko", ".ko.gz", ".ko.xz", ".ko.zst"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500319 if found_ko:
320 return found_ko
321 return False
322
323 def _generate_kernel_module_deps(self):
324 modules_dir = os.path.join(self.image_rootfs, 'lib', 'modules')
325 # if we don't have any modules don't bother to do the depmod
326 if not self._check_for_kernel_modules(modules_dir):
327 bb.note("No Kernel Modules found, not running depmod")
328 return
329
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500330 pkgdatadir = self.d.getVar('PKGDATA_DIR')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500331
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500332 # PKGDATA_DIR can include multiple kernels so we run depmod for each
333 # one of them.
334 for direntry in os.listdir(pkgdatadir):
335 match = re.match('(.*)-depmod', direntry)
336 if not match:
337 continue
338 kernel_package_name = match.group(1)
Andrew Geissler78b72792022-06-14 06:47:25 -0500339
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500340 kernel_abi_ver_file = oe.path.join(pkgdatadir, direntry, kernel_package_name + '-abiversion')
341 if not os.path.exists(kernel_abi_ver_file):
342 bb.fatal("No kernel-abiversion file found (%s), cannot run depmod, aborting" % kernel_abi_ver_file)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500343
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500344 with open(kernel_abi_ver_file) as f:
345 kernel_ver = f.read().strip(' \n')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500346
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500347 versioned_modules_dir = os.path.join(self.image_rootfs, modules_dir, kernel_ver)
348
349 bb.utils.mkdirhier(versioned_modules_dir)
350
351 bb.note("Running depmodwrapper for %s ..." % versioned_modules_dir)
Patrick Williams705982a2024-01-12 09:51:57 -0600352 if self._exec_shell_cmd(['depmodwrapper', '-a', '-b', self.image_rootfs, kernel_ver, kernel_package_name]):
353 bb.fatal("Kernel modules dependency generation failed")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500354
355 """
356 Create devfs:
357 * IMAGE_DEVICE_TABLE is the old name to an absolute path to a device table file
358 * IMAGE_DEVICE_TABLES is a new name for a file, or list of files, seached
359 for in the BBPATH
360 If neither are specified then the default name of files/device_table-minimal.txt
361 is searched for in the BBPATH (same as the old version.)
362 """
363 def _create_devfs(self):
364 devtable_list = []
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500365 devtable = self.d.getVar('IMAGE_DEVICE_TABLE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500366 if devtable is not None:
367 devtable_list.append(devtable)
368 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500369 devtables = self.d.getVar('IMAGE_DEVICE_TABLES')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500370 if devtables is None:
371 devtables = 'files/device_table-minimal.txt'
372 for devtable in devtables.split():
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500373 devtable_list.append("%s" % bb.utils.which(self.d.getVar('BBPATH'), devtable))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500374
375 for devtable in devtable_list:
376 self._exec_shell_cmd(["makedevs", "-r",
377 self.image_rootfs, "-D", devtable])
378
379
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500380def get_class_for_type(imgtype):
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600381 import importlib
382 mod = importlib.import_module('oe.package_manager.' + imgtype + '.rootfs')
383 return mod.PkgRootfs
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500384
385def variable_depends(d, manifest_dir=None):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500386 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500387 cls = get_class_for_type(img_type)
388 return cls._depends_list()
389
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500390def create_rootfs(d, manifest_dir=None, progress_reporter=None, logcatcher=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500391 env_bkp = os.environ.copy()
392
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500393 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500394
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600395 cls = get_class_for_type(img_type)
396 cls(d, manifest_dir, progress_reporter, logcatcher).create()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500397 os.environ.clear()
398 os.environ.update(env_bkp)
399
400
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500401def image_list_installed_packages(d, rootfs_dir=None):
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500402 # Theres no rootfs for baremetal images
403 if bb.data.inherits_class('baremetal-image', d):
404 return ""
405
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500406 if not rootfs_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500407 rootfs_dir = d.getVar('IMAGE_ROOTFS')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500408
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500409 img_type = d.getVar('IMAGE_PKGTYPE')
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600410
411 import importlib
412 cls = importlib.import_module('oe.package_manager.' + img_type)
413 return cls.PMPkgsList(d, rootfs_dir).list_pkgs()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500414
415if __name__ == "__main__":
416 """
417 We should be able to run this as a standalone script, from outside bitbake
418 environment.
419 """
420 """
421 TBD
422 """