blob: 8cd48f945062e1ef785cb9992e4a522837f7ff5e [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 Williams56b44a92024-01-19 08:49:29 -0600197 def make_last(command, commands):
198 commands = commands.split()
199 if command in commands:
200 commands.remove(command)
201 commands.append(command)
202 return "".join(commands)
203
204 # We want this to run as late as possible, in particular after
205 # systemd_sysusers_create and set_user_group. Using :append is not enough
206 make_last("tidy_shadowutils_files", post_process_cmds)
207 make_last("rootfs_reproducible", post_process_cmds)
208
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500209 execute_pre_post_process(self.d, pre_process_cmds)
210
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600211 if self.progress_reporter:
212 self.progress_reporter.next_stage()
213
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500214 # call the package manager dependent create method
215 self._create()
216
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500217 sysconfdir = self.image_rootfs + self.d.getVar('sysconfdir')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500218 bb.utils.mkdirhier(sysconfdir)
219 with open(sysconfdir + "/version", "w+") as ver:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500220 ver.write(self.d.getVar('BUILDNAME') + "\n")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500221
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500222 execute_pre_post_process(self.d, rootfs_post_install_cmds)
223
Brad Bishop316dfdd2018-06-25 12:45:53 -0400224 self.pm.run_intercepts()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500225
226 execute_pre_post_process(self.d, post_process_cmds)
227
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600228 if self.progress_reporter:
229 self.progress_reporter.next_stage()
230
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500231 if bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600232 True, False, self.d) and \
233 not bb.utils.contains("IMAGE_FEATURES",
234 "read-only-rootfs-delayed-postinsts",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500235 True, False, self.d):
236 delayed_postinsts = self._get_delayed_postinsts()
237 if delayed_postinsts is not None:
238 bb.fatal("The following packages could not be configured "
239 "offline and rootfs is read-only: %s" %
240 delayed_postinsts)
241
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500242 if self.d.getVar('USE_DEVFS') != "1":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500243 self._create_devfs()
244
245 self._uninstall_unneeded()
246
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600247 if self.progress_reporter:
248 self.progress_reporter.next_stage()
249
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500250 self._insert_feed_uris()
251
252 self._run_ldconfig()
253
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500254 if self.d.getVar('USE_DEPMOD') != "0":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500255 self._generate_kernel_module_deps()
256
257 self._cleanup()
258 self._log_check()
259
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600260 if self.progress_reporter:
261 self.progress_reporter.next_stage()
262
263
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500264 def _uninstall_unneeded(self):
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500265 # Remove the run-postinsts package if no delayed postinsts are found
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500266 delayed_postinsts = self._get_delayed_postinsts()
267 if delayed_postinsts is None:
Andrew Geissler5199d832021-09-24 16:47:35 -0500268 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 -0500269 self.pm.remove(["run-postinsts"])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500270
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500271 image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500272 True, False, self.d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500273 image_rorfs_force = self.d.getVar('FORCE_RO_REMOVE')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600274
275 if image_rorfs or image_rorfs_force == "1":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500276 # Remove components that we don't need if it's a read-only rootfs
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500277 unneeded_pkgs = self.d.getVar("ROOTFS_RO_UNNEEDED").split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500278 pkgs_installed = image_list_installed_packages(self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500279 # Make sure update-alternatives is removed last. This is
280 # because its database has to available while uninstalling
281 # other packages, allowing alternative symlinks of packages
282 # to be uninstalled or to be managed correctly otherwise.
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500283 provider = self.d.getVar("VIRTUAL-RUNTIME_update-alternatives")
284 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 -0500285
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500286 # update-alternatives provider is removed in its own remove()
287 # call because all package managers do not guarantee the packages
288 # are removed in the order they given in the list (which is
289 # passed to the command line). The sorting done earlier is
290 # utilized to implement the 2-stage removal.
291 if len(pkgs_to_remove) > 1:
292 self.pm.remove(pkgs_to_remove[:-1], False)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500293 if len(pkgs_to_remove) > 0:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500294 self.pm.remove([pkgs_to_remove[-1]], False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500295
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500296 if delayed_postinsts:
297 self._save_postinsts()
298 if image_rorfs:
299 bb.warn("There are post install scripts "
300 "in a read-only rootfs")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500301
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500302 post_uninstall_cmds = self.d.getVar("ROOTFS_POSTUNINSTALL_COMMAND")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500303 execute_pre_post_process(self.d, post_uninstall_cmds)
304
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500305 runtime_pkgmanage = bb.utils.contains("IMAGE_FEATURES", "package-management",
306 True, False, self.d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500307 if not runtime_pkgmanage:
308 # Remove the package manager data files
309 self.pm.remove_packaging_data()
310
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500311 def _run_ldconfig(self):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500312 if self.d.getVar('LDCONFIGDEPEND'):
Andrew Geissler475cb722020-07-10 16:00:51 -0500313 bb.note("Executing: ldconfig -r " + self.image_rootfs + " -c new -v -X")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500314 self._exec_shell_cmd(['ldconfig', '-r', self.image_rootfs, '-c',
Andrew Geissler475cb722020-07-10 16:00:51 -0500315 'new', '-v', '-X'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500316
Patrick Williams213cb262021-08-07 19:21:33 -0500317 image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
318 True, False, self.d)
319 ldconfig_in_features = bb.utils.contains("DISTRO_FEATURES", "ldconfig",
320 True, False, self.d)
321 if image_rorfs or not ldconfig_in_features:
322 ldconfig_cache_dir = os.path.join(self.image_rootfs, "var/cache/ldconfig")
323 if os.path.exists(ldconfig_cache_dir):
324 bb.note("Removing ldconfig auxiliary cache...")
325 shutil.rmtree(ldconfig_cache_dir)
326
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500327 def _check_for_kernel_modules(self, modules_dir):
328 for root, dirs, files in os.walk(modules_dir, topdown=True):
329 for name in files:
Andrew Geissler78b72792022-06-14 06:47:25 -0500330 found_ko = name.endswith((".ko", ".ko.gz", ".ko.xz", ".ko.zst"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500331 if found_ko:
332 return found_ko
333 return False
334
335 def _generate_kernel_module_deps(self):
336 modules_dir = os.path.join(self.image_rootfs, 'lib', 'modules')
337 # if we don't have any modules don't bother to do the depmod
338 if not self._check_for_kernel_modules(modules_dir):
339 bb.note("No Kernel Modules found, not running depmod")
340 return
341
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500342 pkgdatadir = self.d.getVar('PKGDATA_DIR')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500343
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500344 # PKGDATA_DIR can include multiple kernels so we run depmod for each
345 # one of them.
346 for direntry in os.listdir(pkgdatadir):
347 match = re.match('(.*)-depmod', direntry)
348 if not match:
349 continue
350 kernel_package_name = match.group(1)
Andrew Geissler78b72792022-06-14 06:47:25 -0500351
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500352 kernel_abi_ver_file = oe.path.join(pkgdatadir, direntry, kernel_package_name + '-abiversion')
353 if not os.path.exists(kernel_abi_ver_file):
354 bb.fatal("No kernel-abiversion file found (%s), cannot run depmod, aborting" % kernel_abi_ver_file)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500355
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500356 with open(kernel_abi_ver_file) as f:
357 kernel_ver = f.read().strip(' \n')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500358
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500359 versioned_modules_dir = os.path.join(self.image_rootfs, modules_dir, kernel_ver)
360
361 bb.utils.mkdirhier(versioned_modules_dir)
362
363 bb.note("Running depmodwrapper for %s ..." % versioned_modules_dir)
Patrick Williams705982a2024-01-12 09:51:57 -0600364 if self._exec_shell_cmd(['depmodwrapper', '-a', '-b', self.image_rootfs, kernel_ver, kernel_package_name]):
365 bb.fatal("Kernel modules dependency generation failed")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500366
367 """
368 Create devfs:
369 * IMAGE_DEVICE_TABLE is the old name to an absolute path to a device table file
370 * IMAGE_DEVICE_TABLES is a new name for a file, or list of files, seached
371 for in the BBPATH
372 If neither are specified then the default name of files/device_table-minimal.txt
373 is searched for in the BBPATH (same as the old version.)
374 """
375 def _create_devfs(self):
376 devtable_list = []
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500377 devtable = self.d.getVar('IMAGE_DEVICE_TABLE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500378 if devtable is not None:
379 devtable_list.append(devtable)
380 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500381 devtables = self.d.getVar('IMAGE_DEVICE_TABLES')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500382 if devtables is None:
383 devtables = 'files/device_table-minimal.txt'
384 for devtable in devtables.split():
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500385 devtable_list.append("%s" % bb.utils.which(self.d.getVar('BBPATH'), devtable))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500386
387 for devtable in devtable_list:
388 self._exec_shell_cmd(["makedevs", "-r",
389 self.image_rootfs, "-D", devtable])
390
391
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500392def get_class_for_type(imgtype):
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600393 import importlib
394 mod = importlib.import_module('oe.package_manager.' + imgtype + '.rootfs')
395 return mod.PkgRootfs
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500396
397def variable_depends(d, manifest_dir=None):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500398 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500399 cls = get_class_for_type(img_type)
400 return cls._depends_list()
401
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500402def create_rootfs(d, manifest_dir=None, progress_reporter=None, logcatcher=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500403 env_bkp = os.environ.copy()
404
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500405 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500406
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600407 cls = get_class_for_type(img_type)
408 cls(d, manifest_dir, progress_reporter, logcatcher).create()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500409 os.environ.clear()
410 os.environ.update(env_bkp)
411
412
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500413def image_list_installed_packages(d, rootfs_dir=None):
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500414 # Theres no rootfs for baremetal images
415 if bb.data.inherits_class('baremetal-image', d):
416 return ""
417
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500418 if not rootfs_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500419 rootfs_dir = d.getVar('IMAGE_ROOTFS')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500420
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500421 img_type = d.getVar('IMAGE_PKGTYPE')
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600422
423 import importlib
424 cls = importlib.import_module('oe.package_manager.' + img_type)
425 return cls.PMPkgsList(d, rootfs_dir).list_pkgs()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500426
427if __name__ == "__main__":
428 """
429 We should be able to run this as a standalone script, from outside bitbake
430 environment.
431 """
432 """
433 TBD
434 """