summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/rootfs.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oe/rootfs.py')
-rw-r--r--meta/lib/oe/rootfs.py51
1 files changed, 49 insertions, 2 deletions
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 78e9627682..2b2915e470 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -3,6 +3,8 @@ from oe.utils import execute_pre_post_process
3from oe.utils import contains as base_contains 3from oe.utils import contains as base_contains
4from oe.package_manager import * 4from oe.package_manager import *
5from oe.manifest import * 5from oe.manifest import *
6import oe.path
7import filecmp
6import shutil 8import shutil
7import os 9import os
8import subprocess 10import subprocess
@@ -458,13 +460,58 @@ class OpkgRootfs(Rootfs):
458 460
459 bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS', True), True) 461 bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS', True), True)
460 462
463 def _prelink_file(self, root_dir, filename):
464 bb.note('prelink %s in %s' % (filename, root_dir))
465 prelink_cfg = oe.path.join(root_dir,
466 self.d.expand('${sysconfdir}/prelink.conf'))
467 if not os.path.exists(prelink_cfg):
468 shutil.copy(self.d.expand('${STAGING_DIR_NATIVE}${sysconfdir_native}/prelink.conf'),
469 prelink_cfg)
470
471 cmd_prelink = self.d.expand('${STAGING_DIR_NATIVE}${sbindir_native}/prelink')
472 self._exec_shell_cmd([cmd_prelink,
473 '--root',
474 root_dir,
475 '-amR',
476 '-N',
477 '-c',
478 self.d.expand('${sysconfdir}/prelink.conf')])
479
480 '''
481 Compare two files with the same key twice to see if they are equal.
482 If they are not equal, it means they are duplicated and come from
483 different packages.
484 1st: Comapre them directly;
485 2nd: While incremental image creation is enabled, one of the
486 files could be probaly prelinked in the previous image
487 creation and the file has been changed, so we need to
488 prelink the other one and compare them.
489 '''
490 def _file_equal(self, key, f1, f2):
491
492 # Both of them are not prelinked
493 if filecmp.cmp(f1, f2):
494 return True
495
496 if self.image_rootfs not in f1:
497 self._prelink_file(f1.replace(key, ''), f1)
498
499 if self.image_rootfs not in f2:
500 self._prelink_file(f2.replace(key, ''), f2)
501
502 # Both of them are prelinked
503 if filecmp.cmp(f1, f2):
504 return True
505
506 # Not equal
507 return False
508
461 """ 509 """
462 This function was reused from the old implementation. 510 This function was reused from the old implementation.
463 See commit: "image.bbclass: Added variables for multilib support." by 511 See commit: "image.bbclass: Added variables for multilib support." by
464 Lianhao Lu. 512 Lianhao Lu.
465 """ 513 """
466 def _multilib_sanity_test(self, dirs): 514 def _multilib_sanity_test(self, dirs):
467 import filecmp
468 515
469 allow_replace = self.d.getVar("MULTILIBRE_ALLOW_REP", True) 516 allow_replace = self.d.getVar("MULTILIBRE_ALLOW_REP", True)
470 if allow_replace is None: 517 if allow_replace is None:
@@ -488,7 +535,7 @@ class OpkgRootfs(Rootfs):
488 else: 535 else:
489 if os.path.exists(files[key]) and \ 536 if os.path.exists(files[key]) and \
490 os.path.exists(item) and \ 537 os.path.exists(item) and \
491 not filecmp.cmp(files[key], item): 538 not self._file_equal(key, files[key], item):
492 valid = False 539 valid = False
493 bb.fatal("%s duplicate files %s %s is not the same\n" % 540 bb.fatal("%s duplicate files %s %s is not the same\n" %
494 (error_prompt, item, files[key])) 541 (error_prompt, item, files[key]))