summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
Diffstat (limited to 'meta')
-rw-r--r--meta/lib/oe/rootfs.py158
1 files changed, 149 insertions, 9 deletions
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index abdb0dd18a..bada5ca467 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -15,17 +15,20 @@ class Rootfs(object):
15 """ 15 """
16 __metaclass__ = ABCMeta 16 __metaclass__ = ABCMeta
17 17
18 def __init__(self, d, manifest_dir=None): 18 def __init__(self, d):
19 self.d = d 19 self.d = d
20 self.pm = None 20 self.pm = None
21 self.manifest = None
22 self.image_rootfs = self.d.getVar('IMAGE_ROOTFS', True) 21 self.image_rootfs = self.d.getVar('IMAGE_ROOTFS', True)
23 self.deploy_dir_image = self.d.getVar('DEPLOY_DIR_IMAGE', True) 22 self.deploy_dir_image = self.d.getVar('DEPLOY_DIR_IMAGE', True)
24 23
25 bb.utils.remove(self.image_rootfs, True) 24 bb.utils.remove(self.image_rootfs, True)
26 bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS', True), True) 25 bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS', True), True)
27 26
28 self.install_order = ["lgp", "mip", "aop", "mlp"] 27 self.install_order = [
28 Manifest.PKG_TYPE_LANGUAGE,
29 Manifest.PKG_TYPE_MUST_INSTALL,
30 Manifest.PKG_TYPE_ATTEMPT_ONLY,
31 Manifest.PKG_TYPE_MULTILIB]
29 32
30 @abstractmethod 33 @abstractmethod
31 def _create(self): 34 def _create(self):
@@ -225,7 +228,7 @@ class RpmRootfs(Rootfs):
225 228
226class DpkgRootfs(Rootfs): 229class DpkgRootfs(Rootfs):
227 def __init__(self, d, manifest_dir): 230 def __init__(self, d, manifest_dir):
228 super(DpkgRootfs, self).__init__(d, manifest_dir) 231 super(DpkgRootfs, self).__init__(d)
229 232
230 self.manifest = DpkgManifest(d, manifest_dir) 233 self.manifest = DpkgManifest(d, manifest_dir)
231 self.pm = DpkgPM(d, d.getVar('IMAGE_ROOTFS', True), 234 self.pm = DpkgPM(d, d.getVar('IMAGE_ROOTFS', True),
@@ -246,7 +249,7 @@ class DpkgRootfs(Rootfs):
246 for pkg_type in self.install_order: 249 for pkg_type in self.install_order:
247 if pkg_type in pkgs_to_install: 250 if pkg_type in pkgs_to_install:
248 self.pm.install(pkgs_to_install[pkg_type], 251 self.pm.install(pkgs_to_install[pkg_type],
249 [False, True][pkg_type == "aop"]) 252 [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY])
250 253
251 self.pm.install_complementary() 254 self.pm.install_complementary()
252 255
@@ -297,11 +300,148 @@ class DpkgRootfs(Rootfs):
297 300
298 301
299class OpkgRootfs(Rootfs): 302class OpkgRootfs(Rootfs):
300 def __init__(self, manifest): 303 def __init__(self, d, manifest_dir):
301 super(OpkgRootfs, self).__init__(manifest) 304 super(OpkgRootfs, self).__init__(d)
305
306 self.manifest = OpkgManifest(d, manifest_dir)
307 self.opkg_conf = self.d.getVar("IPKGCONF_TARGET", True)
308 self.pkg_archs = self.d.getVar("ALL_MULTILIB_PACKAGE_ARCHS", True)
309
310 self.pm = OpkgPM(d, self.image_rootfs, self.opkg_conf, self.pkg_archs)
311
302 """ 312 """
303 TBD 313 This function was reused from the old implementation.
314 See commit: "image.bbclass: Added variables for multilib support." by
315 Lianhao Lu.
304 """ 316 """
317 def _multilib_sanity_test(self, dirs):
318 import filecmp
319
320 allow_replace = self.d.getVar("MULTILIBRE_ALLOW_REP", True)
321 if allow_replace is None:
322 allow_replace = ""
323
324 allow_rep = re.compile(re.sub("\|$", "", allow_replace))
325 error_prompt = "Multilib check error:"
326
327 files = {}
328 for dir in dirs:
329 for root, subfolders, subfiles in os.walk(dir):
330 for file in subfiles:
331 item = os.path.join(root, file)
332 key = str(os.path.join("/", os.path.relpath(item, dir)))
333
334 valid = True
335 if key in files:
336 #check whether the file is allow to replace
337 if allow_rep.match(key):
338 valid = True
339 else:
340 if not filecmp.cmp(files[key], item):
341 valid = False
342 bb.fatal("%s duplicate files %s %s is not the same\n" %
343 (error_prompt, item, files[key]))
344
345 #pass the check, add to list
346 if valid:
347 files[key] = item
348
349 def _multilib_test_install(self, pkgs):
350 ml_temp = self.d.getVar("MULTILIB_TEMP_ROOTFS", True)
351 bb.utils.mkdirhier(ml_temp)
352
353 dirs = [self.image_rootfs]
354
355 for variant in self.d.getVar("MULTILIB_VARIANTS", True).split():
356 ml_target_rootfs = os.path.join(ml_temp, variant)
357
358 bb.utils.remove(ml_target_rootfs, True)
359
360 ml_opkg_conf = os.path.join(ml_temp,
361 variant + "-" + os.path.basename(self.opkg_conf))
362
363 ml_pm = OpkgPM(self.d, ml_target_rootfs, ml_opkg_conf, self.pkg_archs)
364
365 ml_pm.update()
366 ml_pm.install(pkgs)
367
368 dirs.append(ml_target_rootfs)
369
370 self._multilib_sanity_test(dirs)
371
372 def _create(self):
373 pkgs_to_install = self.manifest.parse_initial_manifest()
374 opkg_pre_process_cmds = self.d.getVar('OPKG_PREPROCESS_COMMANDS', True)
375 opkg_post_process_cmds = self.d.getVar('OPKG_POSTPROCESS_COMMANDS', True)
376 rootfs_post_install_cmds = self.d.getVar('ROOTFS_POSTINSTALL_COMMAND', True)
377
378 # update PM index files
379 self.pm.write_index()
380
381 execute_pre_post_process(self.d, opkg_pre_process_cmds)
382
383 self.pm.update()
384
385 self.pm.handle_bad_recommendations()
386
387 for pkg_type in self.install_order:
388 if pkg_type in pkgs_to_install:
389 # For multilib, we perform a sanity test before final install
390 # If sanity test fails, it will automatically do a bb.fatal()
391 # and the installation will stop
392 if pkg_type == Manifest.PKG_TYPE_MULTILIB:
393 self._multilib_test_install(pkgs_to_install[pkg_type])
394
395 self.pm.install(pkgs_to_install[pkg_type],
396 [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY])
397
398 self.pm.install_complementary()
399
400 execute_pre_post_process(self.d, opkg_post_process_cmds)
401 execute_pre_post_process(self.d, rootfs_post_install_cmds)
402
403 def _get_delayed_postinsts(self):
404 pkg_list = []
405 status_file = os.path.join(self.image_rootfs,
406 self.d.getVar('OPKGLIBDIR', True),
407 "opkg", "status")
408
409 with open(status_file) as status:
410 for line in status:
411 m_pkg = re.match("^Package: (.*)", line)
412 m_status = re.match("^Status:.*unpacked", line)
413 if m_pkg is not None:
414 pkg_name = m_pkg.group(1)
415 elif m_status is not None:
416 pkg_list.append(pkg_name)
417
418 if len(pkg_list) == 0:
419 return None
420
421 return pkg_list
422
423 def _save_postinsts(self):
424 num = 0
425 for p in self._get_delayed_postinsts():
426 dst_postinst_dir = self.d.expand("${IMAGE_ROOTFS}${sysconfdir}/ipk-postinsts")
427 src_postinst_dir = self.d.expand("${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/info")
428
429 bb.utils.mkdirhier(dst_postinst_dir)
430
431 if os.path.exists(os.path.join(src_postinst_dir, p + ".postinst")):
432 shutil.copy(os.path.join(src_postinst_dir, p + ".postinst"),
433 os.path.join(dst_postinst_dir, "%03d-%s" % (num, p)))
434
435 num += 1
436
437 def _handle_intercept_failure(self, registered_pkgs):
438 self.pm.mark_packages("unpacked", registered_pkgs.split())
439
440 def _log_check(self):
441 pass
442
443 def _insert_feed_uris(self):
444 pass
305 445
306 446
307def create_rootfs(d, manifest_dir=None): 447def create_rootfs(d, manifest_dir=None):
@@ -311,7 +451,7 @@ def create_rootfs(d, manifest_dir=None):
311 if img_type == "rpm": 451 if img_type == "rpm":
312 bb.fatal("RPM backend was not implemented yet...") 452 bb.fatal("RPM backend was not implemented yet...")
313 elif img_type == "ipk": 453 elif img_type == "ipk":
314 bb.fatal("IPK backend was not implemented yet...") 454 OpkgRootfs(d, manifest_dir).create()
315 elif img_type == "deb": 455 elif img_type == "deb":
316 DpkgRootfs(d, manifest_dir).create() 456 DpkgRootfs(d, manifest_dir).create()
317 457