diff options
Diffstat (limited to 'meta/lib/oe/rootfs.py')
-rw-r--r-- | meta/lib/oe/rootfs.py | 51 |
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 | |||
3 | from oe.utils import contains as base_contains | 3 | from oe.utils import contains as base_contains |
4 | from oe.package_manager import * | 4 | from oe.package_manager import * |
5 | from oe.manifest import * | 5 | from oe.manifest import * |
6 | import oe.path | ||
7 | import filecmp | ||
6 | import shutil | 8 | import shutil |
7 | import os | 9 | import os |
8 | import subprocess | 10 | import 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])) |