blob: 4e09eae6b91f9ccb0c26fa58ce376adcb7ed6265 [file] [log] [blame]
Brad Bishopc342db32019-05-15 21:57:59 -04001#
2# SPDX-License-Identifier: GPL-2.0-only
3#
Patrick Williamsc124f4f2015-09-15 14:41:29 -05004from abc import ABCMeta, abstractmethod
5from oe.utils import execute_pre_post_process
6from oe.package_manager import *
7from oe.manifest import *
8import oe.path
Patrick Williamsc124f4f2015-09-15 14:41:29 -05009import shutil
10import os
11import subprocess
12import re
Andrew Geissler635e0e42020-08-21 15:58:33 -050013from oe.package_manager.rpm.manifest import RpmManifest
14from oe.package_manager.ipk.manifest import OpkgManifest
15from oe.package_manager.deb.manifest import DpkgManifest
16from oe.package_manager.rpm import RpmPkgsList
17from oe.package_manager.ipk import OpkgPkgsList
18from oe.package_manager.deb import DpkgPkgsList
Patrick Williamsc124f4f2015-09-15 14:41:29 -050019
Patrick Williamsc0f7c042017-02-23 20:41:17 -060020class Rootfs(object, metaclass=ABCMeta):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050021 """
22 This is an abstract class. Do not instantiate this directly.
23 """
Patrick Williamsc124f4f2015-09-15 14:41:29 -050024
Brad Bishop6e60e8b2018-02-01 10:27:11 -050025 def __init__(self, d, progress_reporter=None, logcatcher=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050026 self.d = d
27 self.pm = None
Brad Bishop6e60e8b2018-02-01 10:27:11 -050028 self.image_rootfs = self.d.getVar('IMAGE_ROOTFS')
29 self.deploydir = self.d.getVar('IMGDEPLOYDIR')
Patrick Williamsc0f7c042017-02-23 20:41:17 -060030 self.progress_reporter = progress_reporter
Brad Bishop6e60e8b2018-02-01 10:27:11 -050031 self.logcatcher = logcatcher
Patrick Williamsc124f4f2015-09-15 14:41:29 -050032
33 self.install_order = Manifest.INSTALL_ORDER
34
35 @abstractmethod
36 def _create(self):
37 pass
38
39 @abstractmethod
40 def _get_delayed_postinsts(self):
41 pass
42
43 @abstractmethod
44 def _save_postinsts(self):
45 pass
46
47 @abstractmethod
48 def _log_check(self):
49 pass
50
Patrick Williamsc0f7c042017-02-23 20:41:17 -060051 def _log_check_common(self, type, match):
52 # Ignore any lines containing log_check to avoid recursion, and ignore
53 # lines beginning with a + since sh -x may emit code which isn't
54 # actually executed, but may contain error messages
55 excludes = [ 'log_check', r'^\+' ]
56 if hasattr(self, 'log_check_expected_regexes'):
57 excludes.extend(self.log_check_expected_regexes)
Andrew Geissler4c19ea12020-10-27 13:52:24 -050058 # Insert custom log_check excludes
59 excludes += [x for x in (self.d.getVar("IMAGE_LOG_CHECK_EXCLUDES") or "").split(" ") if x]
Patrick Williamsc0f7c042017-02-23 20:41:17 -060060 excludes = [re.compile(x) for x in excludes]
61 r = re.compile(match)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050062 log_path = self.d.expand("${T}/log.do_rootfs")
Patrick Williamsc0f7c042017-02-23 20:41:17 -060063 messages = []
Patrick Williamsc124f4f2015-09-15 14:41:29 -050064 with open(log_path, 'r') as log:
65 for line in log:
Brad Bishop6e60e8b2018-02-01 10:27:11 -050066 if self.logcatcher and self.logcatcher.contains(line.rstrip()):
67 continue
Patrick Williamsc0f7c042017-02-23 20:41:17 -060068 for ee in excludes:
69 m = ee.search(line)
70 if m:
71 break
72 if m:
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 continue
74
75 m = r.search(line)
76 if m:
Patrick Williamsc0f7c042017-02-23 20:41:17 -060077 messages.append('[log_check] %s' % line)
78 if messages:
79 if len(messages) == 1:
80 msg = '1 %s message' % type
81 else:
82 msg = '%d %s messages' % (len(messages), type)
83 msg = '[log_check] %s: found %s in the logfile:\n%s' % \
Brad Bishop6e60e8b2018-02-01 10:27:11 -050084 (self.d.getVar('PN'), msg, ''.join(messages))
Patrick Williamsc0f7c042017-02-23 20:41:17 -060085 if type == 'error':
86 bb.fatal(msg)
87 else:
88 bb.warn(msg)
89
90 def _log_check_warn(self):
91 self._log_check_common('warning', '^(warn|Warn|WARNING:)')
Patrick Williamsc124f4f2015-09-15 14:41:29 -050092
93 def _log_check_error(self):
Patrick Williamsc0f7c042017-02-23 20:41:17 -060094 self._log_check_common('error', self.log_check_regex)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050095
96 def _insert_feed_uris(self):
97 if bb.utils.contains("IMAGE_FEATURES", "package-management",
98 True, False, self.d):
Brad Bishop6e60e8b2018-02-01 10:27:11 -050099 self.pm.insert_feeds_uris(self.d.getVar('PACKAGE_FEED_URIS') or "",
100 self.d.getVar('PACKAGE_FEED_BASE_PATHS') or "",
101 self.d.getVar('PACKAGE_FEED_ARCHS'))
102
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500103
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500104 """
105 The _cleanup() method should be used to clean-up stuff that we don't really
106 want to end up on target. For example, in the case of RPM, the DB locks.
107 The method is called, once, at the end of create() method.
108 """
109 @abstractmethod
110 def _cleanup(self):
111 pass
112
113 def _setup_dbg_rootfs(self, dirs):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500114 gen_debugfs = self.d.getVar('IMAGE_GEN_DEBUGFS') or '0'
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500115 if gen_debugfs != '1':
116 return
117
118 bb.note(" Renaming the original rootfs...")
119 try:
120 shutil.rmtree(self.image_rootfs + '-orig')
121 except:
122 pass
123 os.rename(self.image_rootfs, self.image_rootfs + '-orig')
124
125 bb.note(" Creating debug rootfs...")
126 bb.utils.mkdirhier(self.image_rootfs)
127
128 bb.note(" Copying back package database...")
129 for dir in dirs:
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600130 if not os.path.isdir(self.image_rootfs + '-orig' + dir):
131 continue
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500132 bb.utils.mkdirhier(self.image_rootfs + os.path.dirname(dir))
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600133 shutil.copytree(self.image_rootfs + '-orig' + dir, self.image_rootfs + dir, symlinks=True)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500134
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500135 # Copy files located in /usr/lib/debug or /usr/src/debug
136 for dir in ["/usr/lib/debug", "/usr/src/debug"]:
137 src = self.image_rootfs + '-orig' + dir
Andrew Geissler82c905d2020-04-13 13:39:40 -0500138 if os.path.exists(src):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500139 dst = self.image_rootfs + dir
140 bb.utils.mkdirhier(os.path.dirname(dst))
141 shutil.copytree(src, dst)
142
143 # Copy files with suffix '.debug' or located in '.debug' dir.
Andrew Geissler82c905d2020-04-13 13:39:40 -0500144 for root, dirs, files in os.walk(self.image_rootfs + '-orig'):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500145 relative_dir = root[len(self.image_rootfs + '-orig'):]
146 for f in files:
147 if f.endswith('.debug') or '/.debug' in relative_dir:
148 bb.utils.mkdirhier(self.image_rootfs + relative_dir)
149 shutil.copy(os.path.join(root, f),
150 self.image_rootfs + relative_dir)
151
152 bb.note(" Install complementary '*-dbg' packages...")
153 self.pm.install_complementary('*-dbg')
154
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800155 if self.d.getVar('PACKAGE_DEBUG_SPLIT_STYLE') == 'debug-with-srcpkg':
156 bb.note(" Install complementary '*-src' packages...")
157 self.pm.install_complementary('*-src')
158
159 """
160 Install additional debug packages. Possibility to install additional packages,
161 which are not automatically installed as complementary package of
162 standard one, e.g. debug package of static libraries.
163 """
164 extra_debug_pkgs = self.d.getVar('IMAGE_INSTALL_DEBUGFS')
165 if extra_debug_pkgs:
166 bb.note(" Install extra debug packages...")
167 self.pm.install(extra_debug_pkgs.split(), True)
168
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500169 bb.note(" Rename debug rootfs...")
170 try:
171 shutil.rmtree(self.image_rootfs + '-dbg')
172 except:
173 pass
174 os.rename(self.image_rootfs, self.image_rootfs + '-dbg')
175
176 bb.note(" Restoreing original rootfs...")
177 os.rename(self.image_rootfs + '-orig', self.image_rootfs)
178
179 def _exec_shell_cmd(self, cmd):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500180 fakerootcmd = self.d.getVar('FAKEROOT')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500181 if fakerootcmd is not None:
182 exec_cmd = [fakerootcmd, cmd]
183 else:
184 exec_cmd = cmd
185
186 try:
187 subprocess.check_output(exec_cmd, stderr=subprocess.STDOUT)
188 except subprocess.CalledProcessError as e:
189 return("Command '%s' returned %d:\n%s" % (e.cmd, e.returncode, e.output))
190
191 return None
192
193 def create(self):
194 bb.note("###### Generate rootfs #######")
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500195 pre_process_cmds = self.d.getVar("ROOTFS_PREPROCESS_COMMAND")
196 post_process_cmds = self.d.getVar("ROOTFS_POSTPROCESS_COMMAND")
197 rootfs_post_install_cmds = self.d.getVar('ROOTFS_POSTINSTALL_COMMAND')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500198
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500199 bb.utils.mkdirhier(self.image_rootfs)
200
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600201 bb.utils.mkdirhier(self.deploydir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500202
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500203 execute_pre_post_process(self.d, pre_process_cmds)
204
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600205 if self.progress_reporter:
206 self.progress_reporter.next_stage()
207
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500208 # call the package manager dependent create method
209 self._create()
210
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500211 sysconfdir = self.image_rootfs + self.d.getVar('sysconfdir')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500212 bb.utils.mkdirhier(sysconfdir)
213 with open(sysconfdir + "/version", "w+") as ver:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500214 ver.write(self.d.getVar('BUILDNAME') + "\n")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500215
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500216 execute_pre_post_process(self.d, rootfs_post_install_cmds)
217
Brad Bishop316dfdd2018-06-25 12:45:53 -0400218 self.pm.run_intercepts()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500219
220 execute_pre_post_process(self.d, post_process_cmds)
221
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600222 if self.progress_reporter:
223 self.progress_reporter.next_stage()
224
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500225 if bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
226 True, False, self.d):
227 delayed_postinsts = self._get_delayed_postinsts()
228 if delayed_postinsts is not None:
229 bb.fatal("The following packages could not be configured "
230 "offline and rootfs is read-only: %s" %
231 delayed_postinsts)
232
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500233 if self.d.getVar('USE_DEVFS') != "1":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500234 self._create_devfs()
235
236 self._uninstall_unneeded()
237
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600238 if self.progress_reporter:
239 self.progress_reporter.next_stage()
240
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500241 self._insert_feed_uris()
242
243 self._run_ldconfig()
244
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500245 if self.d.getVar('USE_DEPMOD') != "0":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500246 self._generate_kernel_module_deps()
247
248 self._cleanup()
249 self._log_check()
250
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600251 if self.progress_reporter:
252 self.progress_reporter.next_stage()
253
254
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500255 def _uninstall_unneeded(self):
256 # Remove unneeded init script symlinks
257 delayed_postinsts = self._get_delayed_postinsts()
258 if delayed_postinsts is None:
259 if os.path.exists(self.d.expand("${IMAGE_ROOTFS}${sysconfdir}/init.d/run-postinsts")):
260 self._exec_shell_cmd(["update-rc.d", "-f", "-r",
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500261 self.d.getVar('IMAGE_ROOTFS'),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500262 "run-postinsts", "remove"])
263
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500264 image_rorfs = bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500265 True, False, self.d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500266 image_rorfs_force = self.d.getVar('FORCE_RO_REMOVE')
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600267
268 if image_rorfs or image_rorfs_force == "1":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500269 # Remove components that we don't need if it's a read-only rootfs
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500270 unneeded_pkgs = self.d.getVar("ROOTFS_RO_UNNEEDED").split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500271 pkgs_installed = image_list_installed_packages(self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500272 # Make sure update-alternatives is removed last. This is
273 # because its database has to available while uninstalling
274 # other packages, allowing alternative symlinks of packages
275 # to be uninstalled or to be managed correctly otherwise.
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500276 provider = self.d.getVar("VIRTUAL-RUNTIME_update-alternatives")
277 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 -0500278
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500279 # update-alternatives provider is removed in its own remove()
280 # call because all package managers do not guarantee the packages
281 # are removed in the order they given in the list (which is
282 # passed to the command line). The sorting done earlier is
283 # utilized to implement the 2-stage removal.
284 if len(pkgs_to_remove) > 1:
285 self.pm.remove(pkgs_to_remove[:-1], False)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500286 if len(pkgs_to_remove) > 0:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500287 self.pm.remove([pkgs_to_remove[-1]], False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500288
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500289 if delayed_postinsts:
290 self._save_postinsts()
291 if image_rorfs:
292 bb.warn("There are post install scripts "
293 "in a read-only rootfs")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500294
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500295 post_uninstall_cmds = self.d.getVar("ROOTFS_POSTUNINSTALL_COMMAND")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500296 execute_pre_post_process(self.d, post_uninstall_cmds)
297
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500298 runtime_pkgmanage = bb.utils.contains("IMAGE_FEATURES", "package-management",
299 True, False, self.d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500300 if not runtime_pkgmanage:
301 # Remove the package manager data files
302 self.pm.remove_packaging_data()
303
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500304 def _run_ldconfig(self):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500305 if self.d.getVar('LDCONFIGDEPEND'):
Andrew Geissler475cb722020-07-10 16:00:51 -0500306 bb.note("Executing: ldconfig -r " + self.image_rootfs + " -c new -v -X")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500307 self._exec_shell_cmd(['ldconfig', '-r', self.image_rootfs, '-c',
Andrew Geissler475cb722020-07-10 16:00:51 -0500308 'new', '-v', '-X'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500309
310 def _check_for_kernel_modules(self, modules_dir):
311 for root, dirs, files in os.walk(modules_dir, topdown=True):
312 for name in files:
313 found_ko = name.endswith(".ko")
314 if found_ko:
315 return found_ko
316 return False
317
318 def _generate_kernel_module_deps(self):
319 modules_dir = os.path.join(self.image_rootfs, 'lib', 'modules')
320 # if we don't have any modules don't bother to do the depmod
321 if not self._check_for_kernel_modules(modules_dir):
322 bb.note("No Kernel Modules found, not running depmod")
323 return
324
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500325 kernel_abi_ver_file = oe.path.join(self.d.getVar('PKGDATA_DIR'), "kernel-depmod",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500326 'kernel-abiversion')
327 if not os.path.exists(kernel_abi_ver_file):
328 bb.fatal("No kernel-abiversion file found (%s), cannot run depmod, aborting" % kernel_abi_ver_file)
329
330 kernel_ver = open(kernel_abi_ver_file).read().strip(' \n')
331 versioned_modules_dir = os.path.join(self.image_rootfs, modules_dir, kernel_ver)
332
333 bb.utils.mkdirhier(versioned_modules_dir)
334
335 self._exec_shell_cmd(['depmodwrapper', '-a', '-b', self.image_rootfs, kernel_ver])
336
337 """
338 Create devfs:
339 * IMAGE_DEVICE_TABLE is the old name to an absolute path to a device table file
340 * IMAGE_DEVICE_TABLES is a new name for a file, or list of files, seached
341 for in the BBPATH
342 If neither are specified then the default name of files/device_table-minimal.txt
343 is searched for in the BBPATH (same as the old version.)
344 """
345 def _create_devfs(self):
346 devtable_list = []
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500347 devtable = self.d.getVar('IMAGE_DEVICE_TABLE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500348 if devtable is not None:
349 devtable_list.append(devtable)
350 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500351 devtables = self.d.getVar('IMAGE_DEVICE_TABLES')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500352 if devtables is None:
353 devtables = 'files/device_table-minimal.txt'
354 for devtable in devtables.split():
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500355 devtable_list.append("%s" % bb.utils.which(self.d.getVar('BBPATH'), devtable))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500356
357 for devtable in devtable_list:
358 self._exec_shell_cmd(["makedevs", "-r",
359 self.image_rootfs, "-D", devtable])
360
361
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500362def get_class_for_type(imgtype):
Andrew Geissler635e0e42020-08-21 15:58:33 -0500363 from oe.package_manager.rpm.rootfs import RpmRootfs
364 from oe.package_manager.ipk.rootfs import OpkgRootfs
365 from oe.package_manager.deb.rootfs import DpkgRootfs
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500366 return {"rpm": RpmRootfs,
367 "ipk": OpkgRootfs,
368 "deb": DpkgRootfs}[imgtype]
369
370def variable_depends(d, manifest_dir=None):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500371 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500372 cls = get_class_for_type(img_type)
373 return cls._depends_list()
374
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500375def create_rootfs(d, manifest_dir=None, progress_reporter=None, logcatcher=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500376 env_bkp = os.environ.copy()
377
Andrew Geissler635e0e42020-08-21 15:58:33 -0500378 from oe.package_manager.rpm.rootfs import RpmRootfs
379 from oe.package_manager.ipk.rootfs import OpkgRootfs
380 from oe.package_manager.deb.rootfs import DpkgRootfs
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500381 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500382 if img_type == "rpm":
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500383 RpmRootfs(d, manifest_dir, progress_reporter, logcatcher).create()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500384 elif img_type == "ipk":
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500385 OpkgRootfs(d, manifest_dir, progress_reporter, logcatcher).create()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500386 elif img_type == "deb":
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500387 DpkgRootfs(d, manifest_dir, progress_reporter, logcatcher).create()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500388
389 os.environ.clear()
390 os.environ.update(env_bkp)
391
392
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500393def image_list_installed_packages(d, rootfs_dir=None):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500394 if not rootfs_dir:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500395 rootfs_dir = d.getVar('IMAGE_ROOTFS')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500396
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500397 img_type = d.getVar('IMAGE_PKGTYPE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500398 if img_type == "rpm":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500399 return RpmPkgsList(d, rootfs_dir).list_pkgs()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500400 elif img_type == "ipk":
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500401 return OpkgPkgsList(d, rootfs_dir, d.getVar("IPKGCONF_TARGET")).list_pkgs()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500402 elif img_type == "deb":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500403 return DpkgPkgsList(d, rootfs_dir).list_pkgs()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500404
405if __name__ == "__main__":
406 """
407 We should be able to run this as a standalone script, from outside bitbake
408 environment.
409 """
410 """
411 TBD
412 """