diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2016-06-24 00:06:59 +1200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-08 09:57:23 +0100 |
commit | 40712171b2072171ae878de4889faa7be842451d (patch) | |
tree | 76b3696a098584b10e057b50c468e4046ccc3241 /meta | |
parent | 8daa1b419f8d114bc621c05de4ee0f29cbd0d786 (diff) | |
download | poky-40712171b2072171ae878de4889faa7be842451d.tar.gz |
classes/image: implement progress support for do_rootfs
Use the new task progress functionality to report progress during
do_rootfs. This is a little coarse and ideally we would have some
progress within the installation section, but it's better than
nothing.
(From OE-Core rev: 370f08d434480c1790950e40db8f7687da78cb14)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/image.bbclass | 19 | ||||
-rw-r--r-- | meta/lib/oe/rootfs.py | 101 |
2 files changed, 105 insertions, 15 deletions
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index 61295f4bd7..30dfd64828 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass | |||
@@ -198,6 +198,17 @@ fakeroot python do_rootfs () { | |||
198 | from oe.rootfs import create_rootfs | 198 | from oe.rootfs import create_rootfs |
199 | from oe.manifest import create_manifest | 199 | from oe.manifest import create_manifest |
200 | 200 | ||
201 | # NOTE: if you add, remove or significantly refactor the stages of this | ||
202 | # process then you should recalculate the weightings here. This is quite | ||
203 | # easy to do - just change the MultiStageProgressReporter line temporarily | ||
204 | # to pass debug=True as the last parameter and you'll get a printout of | ||
205 | # the weightings as well as a map to the lines where next_stage() was | ||
206 | # called. Of course this isn't critical, but it helps to keep the progress | ||
207 | # reporting accurate. | ||
208 | stage_weights = [1, 203, 354, 186, 65, 4228, 1, 353, 49, 330, 382, 23, 1] | ||
209 | progress_reporter = bb.progress.MultiStageProgressReporter(d, stage_weights) | ||
210 | progress_reporter.next_stage() | ||
211 | |||
201 | # Handle package exclusions | 212 | # Handle package exclusions |
202 | excl_pkgs = d.getVar("PACKAGE_EXCLUDE", True).split() | 213 | excl_pkgs = d.getVar("PACKAGE_EXCLUDE", True).split() |
203 | inst_pkgs = d.getVar("PACKAGE_INSTALL", True).split() | 214 | inst_pkgs = d.getVar("PACKAGE_INSTALL", True).split() |
@@ -230,8 +241,12 @@ fakeroot python do_rootfs () { | |||
230 | # Generate the initial manifest | 241 | # Generate the initial manifest |
231 | create_manifest(d) | 242 | create_manifest(d) |
232 | 243 | ||
233 | # Generate rootfs | 244 | progress_reporter.next_stage() |
234 | create_rootfs(d) | 245 | |
246 | # generate rootfs | ||
247 | create_rootfs(d, progress_reporter=progress_reporter) | ||
248 | |||
249 | progress_reporter.finish() | ||
235 | } | 250 | } |
236 | do_rootfs[dirs] = "${TOPDIR}" | 251 | do_rootfs[dirs] = "${TOPDIR}" |
237 | do_rootfs[cleandirs] += "${S}" | 252 | do_rootfs[cleandirs] += "${S}" |
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py index 1fc35bdc78..ed0bab1fa4 100644 --- a/meta/lib/oe/rootfs.py +++ b/meta/lib/oe/rootfs.py | |||
@@ -15,11 +15,12 @@ class Rootfs(object, metaclass=ABCMeta): | |||
15 | This is an abstract class. Do not instantiate this directly. | 15 | This is an abstract class. Do not instantiate this directly. |
16 | """ | 16 | """ |
17 | 17 | ||
18 | def __init__(self, d): | 18 | def __init__(self, d, progress_reporter=None): |
19 | self.d = d | 19 | self.d = d |
20 | self.pm = None | 20 | self.pm = None |
21 | self.image_rootfs = self.d.getVar('IMAGE_ROOTFS', True) | 21 | self.image_rootfs = self.d.getVar('IMAGE_ROOTFS', True) |
22 | self.deploy_dir_image = self.d.getVar('DEPLOY_DIR_IMAGE', True) | 22 | self.deploy_dir_image = self.d.getVar('DEPLOY_DIR_IMAGE', True) |
23 | self.progress_reporter = progress_reporter | ||
23 | 24 | ||
24 | self.install_order = Manifest.INSTALL_ORDER | 25 | self.install_order = Manifest.INSTALL_ORDER |
25 | 26 | ||
@@ -191,6 +192,9 @@ class Rootfs(object, metaclass=ABCMeta): | |||
191 | 192 | ||
192 | execute_pre_post_process(self.d, pre_process_cmds) | 193 | execute_pre_post_process(self.d, pre_process_cmds) |
193 | 194 | ||
195 | if self.progress_reporter: | ||
196 | self.progress_reporter.next_stage() | ||
197 | |||
194 | # call the package manager dependent create method | 198 | # call the package manager dependent create method |
195 | self._create() | 199 | self._create() |
196 | 200 | ||
@@ -205,6 +209,9 @@ class Rootfs(object, metaclass=ABCMeta): | |||
205 | 209 | ||
206 | execute_pre_post_process(self.d, post_process_cmds) | 210 | execute_pre_post_process(self.d, post_process_cmds) |
207 | 211 | ||
212 | if self.progress_reporter: | ||
213 | self.progress_reporter.next_stage() | ||
214 | |||
208 | if bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", | 215 | if bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", |
209 | True, False, self.d): | 216 | True, False, self.d): |
210 | delayed_postinsts = self._get_delayed_postinsts() | 217 | delayed_postinsts = self._get_delayed_postinsts() |
@@ -218,6 +225,9 @@ class Rootfs(object, metaclass=ABCMeta): | |||
218 | 225 | ||
219 | self._uninstall_unneeded() | 226 | self._uninstall_unneeded() |
220 | 227 | ||
228 | if self.progress_reporter: | ||
229 | self.progress_reporter.next_stage() | ||
230 | |||
221 | self._insert_feed_uris() | 231 | self._insert_feed_uris() |
222 | 232 | ||
223 | self._run_ldconfig() | 233 | self._run_ldconfig() |
@@ -228,6 +238,10 @@ class Rootfs(object, metaclass=ABCMeta): | |||
228 | self._cleanup() | 238 | self._cleanup() |
229 | self._log_check() | 239 | self._log_check() |
230 | 240 | ||
241 | if self.progress_reporter: | ||
242 | self.progress_reporter.next_stage() | ||
243 | |||
244 | |||
231 | def _uninstall_unneeded(self): | 245 | def _uninstall_unneeded(self): |
232 | # Remove unneeded init script symlinks | 246 | # Remove unneeded init script symlinks |
233 | delayed_postinsts = self._get_delayed_postinsts() | 247 | delayed_postinsts = self._get_delayed_postinsts() |
@@ -359,8 +373,8 @@ class Rootfs(object, metaclass=ABCMeta): | |||
359 | 373 | ||
360 | 374 | ||
361 | class RpmRootfs(Rootfs): | 375 | class RpmRootfs(Rootfs): |
362 | def __init__(self, d, manifest_dir): | 376 | def __init__(self, d, manifest_dir, progress_reporter=None): |
363 | super(RpmRootfs, self).__init__(d) | 377 | super(RpmRootfs, self).__init__(d, progress_reporter) |
364 | self.log_check_regex = '(unpacking of archive failed|Cannot find package'\ | 378 | self.log_check_regex = '(unpacking of archive failed|Cannot find package'\ |
365 | '|exit 1|ERROR: |Error: |Error |ERROR '\ | 379 | '|exit 1|ERROR: |Error: |Error |ERROR '\ |
366 | '|Failed |Failed: |Failed$|Failed\(\d+\):)' | 380 | '|Failed |Failed: |Failed$|Failed\(\d+\):)' |
@@ -418,11 +432,17 @@ class RpmRootfs(Rootfs): | |||
418 | 432 | ||
419 | execute_pre_post_process(self.d, rpm_pre_process_cmds) | 433 | execute_pre_post_process(self.d, rpm_pre_process_cmds) |
420 | 434 | ||
435 | if self.progress_reporter: | ||
436 | self.progress_reporter.next_stage() | ||
437 | |||
421 | self.pm.dump_all_available_pkgs() | 438 | self.pm.dump_all_available_pkgs() |
422 | 439 | ||
423 | if self.inc_rpm_image_gen == "1": | 440 | if self.inc_rpm_image_gen == "1": |
424 | self._create_incremental(pkgs_to_install) | 441 | self._create_incremental(pkgs_to_install) |
425 | 442 | ||
443 | if self.progress_reporter: | ||
444 | self.progress_reporter.next_stage() | ||
445 | |||
426 | self.pm.update() | 446 | self.pm.update() |
427 | 447 | ||
428 | pkgs = [] | 448 | pkgs = [] |
@@ -433,12 +453,24 @@ class RpmRootfs(Rootfs): | |||
433 | else: | 453 | else: |
434 | pkgs += pkgs_to_install[pkg_type] | 454 | pkgs += pkgs_to_install[pkg_type] |
435 | 455 | ||
456 | if self.progress_reporter: | ||
457 | self.progress_reporter.next_stage() | ||
458 | |||
436 | self.pm.install(pkgs) | 459 | self.pm.install(pkgs) |
437 | 460 | ||
461 | if self.progress_reporter: | ||
462 | self.progress_reporter.next_stage() | ||
463 | |||
438 | self.pm.install(pkgs_attempt, True) | 464 | self.pm.install(pkgs_attempt, True) |
439 | 465 | ||
466 | if self.progress_reporter: | ||
467 | self.progress_reporter.next_stage() | ||
468 | |||
440 | self.pm.install_complementary() | 469 | self.pm.install_complementary() |
441 | 470 | ||
471 | if self.progress_reporter: | ||
472 | self.progress_reporter.next_stage() | ||
473 | |||
442 | self._setup_dbg_rootfs(['/etc/rpm', '/var/lib/rpm', '/var/lib/smart']) | 474 | self._setup_dbg_rootfs(['/etc/rpm', '/var/lib/rpm', '/var/lib/smart']) |
443 | 475 | ||
444 | execute_pre_post_process(self.d, rpm_post_process_cmds) | 476 | execute_pre_post_process(self.d, rpm_post_process_cmds) |
@@ -450,6 +482,10 @@ class RpmRootfs(Rootfs): | |||
450 | 482 | ||
451 | self.pm.rpm_setup_smart_target_config() | 483 | self.pm.rpm_setup_smart_target_config() |
452 | 484 | ||
485 | if self.progress_reporter: | ||
486 | self.progress_reporter.next_stage() | ||
487 | |||
488 | |||
453 | @staticmethod | 489 | @staticmethod |
454 | def _depends_list(): | 490 | def _depends_list(): |
455 | return ['DEPLOY_DIR_RPM', 'INC_RPM_IMAGE_GEN', 'RPM_PREPROCESS_COMMANDS', | 491 | return ['DEPLOY_DIR_RPM', 'INC_RPM_IMAGE_GEN', 'RPM_PREPROCESS_COMMANDS', |
@@ -494,8 +530,8 @@ class RpmRootfs(Rootfs): | |||
494 | bb.utils.remove(self.pm.install_dir_path, True) | 530 | bb.utils.remove(self.pm.install_dir_path, True) |
495 | 531 | ||
496 | class DpkgOpkgRootfs(Rootfs): | 532 | class DpkgOpkgRootfs(Rootfs): |
497 | def __init__(self, d): | 533 | def __init__(self, d, progress_reporter=None): |
498 | super(DpkgOpkgRootfs, self).__init__(d) | 534 | super(DpkgOpkgRootfs, self).__init__(d, progress_reporter) |
499 | 535 | ||
500 | def _get_pkgs_postinsts(self, status_file): | 536 | def _get_pkgs_postinsts(self, status_file): |
501 | def _get_pkg_depends_list(pkg_depends): | 537 | def _get_pkg_depends_list(pkg_depends): |
@@ -589,8 +625,8 @@ class DpkgOpkgRootfs(Rootfs): | |||
589 | num += 1 | 625 | num += 1 |
590 | 626 | ||
591 | class DpkgRootfs(DpkgOpkgRootfs): | 627 | class DpkgRootfs(DpkgOpkgRootfs): |
592 | def __init__(self, d, manifest_dir): | 628 | def __init__(self, d, manifest_dir, progress_reporter=None): |
593 | super(DpkgRootfs, self).__init__(d) | 629 | super(DpkgRootfs, self).__init__(d, progress_reporter) |
594 | self.log_check_regex = '^E:' | 630 | self.log_check_regex = '^E:' |
595 | self.log_check_expected_regexes = \ | 631 | self.log_check_expected_regexes = \ |
596 | [ | 632 | [ |
@@ -618,15 +654,31 @@ class DpkgRootfs(DpkgOpkgRootfs): | |||
618 | 654 | ||
619 | execute_pre_post_process(self.d, deb_pre_process_cmds) | 655 | execute_pre_post_process(self.d, deb_pre_process_cmds) |
620 | 656 | ||
657 | if self.progress_reporter: | ||
658 | self.progress_reporter.next_stage() | ||
659 | # Don't support incremental, so skip that | ||
660 | self.progress_reporter.next_stage() | ||
661 | |||
621 | self.pm.update() | 662 | self.pm.update() |
622 | 663 | ||
664 | if self.progress_reporter: | ||
665 | self.progress_reporter.next_stage() | ||
666 | |||
623 | for pkg_type in self.install_order: | 667 | for pkg_type in self.install_order: |
624 | if pkg_type in pkgs_to_install: | 668 | if pkg_type in pkgs_to_install: |
625 | self.pm.install(pkgs_to_install[pkg_type], | 669 | self.pm.install(pkgs_to_install[pkg_type], |
626 | [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY]) | 670 | [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY]) |
627 | 671 | ||
672 | if self.progress_reporter: | ||
673 | # Don't support attemptonly, so skip that | ||
674 | self.progress_reporter.next_stage() | ||
675 | self.progress_reporter.next_stage() | ||
676 | |||
628 | self.pm.install_complementary() | 677 | self.pm.install_complementary() |
629 | 678 | ||
679 | if self.progress_reporter: | ||
680 | self.progress_reporter.next_stage() | ||
681 | |||
630 | self._setup_dbg_rootfs(['/var/lib/dpkg']) | 682 | self._setup_dbg_rootfs(['/var/lib/dpkg']) |
631 | 683 | ||
632 | self.pm.fix_broken_dependencies() | 684 | self.pm.fix_broken_dependencies() |
@@ -637,6 +689,9 @@ class DpkgRootfs(DpkgOpkgRootfs): | |||
637 | 689 | ||
638 | execute_pre_post_process(self.d, deb_post_process_cmds) | 690 | execute_pre_post_process(self.d, deb_post_process_cmds) |
639 | 691 | ||
692 | if self.progress_reporter: | ||
693 | self.progress_reporter.next_stage() | ||
694 | |||
640 | @staticmethod | 695 | @staticmethod |
641 | def _depends_list(): | 696 | def _depends_list(): |
642 | return ['DEPLOY_DIR_DEB', 'DEB_SDK_ARCH', 'APTCONF_TARGET', 'APT_ARGS', 'DPKG_ARCH', 'DEB_PREPROCESS_COMMANDS', 'DEB_POSTPROCESS_COMMANDS'] | 697 | return ['DEPLOY_DIR_DEB', 'DEB_SDK_ARCH', 'APTCONF_TARGET', 'APT_ARGS', 'DPKG_ARCH', 'DEB_PREPROCESS_COMMANDS', 'DEB_POSTPROCESS_COMMANDS'] |
@@ -662,8 +717,8 @@ class DpkgRootfs(DpkgOpkgRootfs): | |||
662 | 717 | ||
663 | 718 | ||
664 | class OpkgRootfs(DpkgOpkgRootfs): | 719 | class OpkgRootfs(DpkgOpkgRootfs): |
665 | def __init__(self, d, manifest_dir): | 720 | def __init__(self, d, manifest_dir, progress_reporter=None): |
666 | super(OpkgRootfs, self).__init__(d) | 721 | super(OpkgRootfs, self).__init__(d, progress_reporter) |
667 | self.log_check_regex = '(exit 1|Collected errors)' | 722 | self.log_check_regex = '(exit 1|Collected errors)' |
668 | 723 | ||
669 | self.manifest = OpkgManifest(d, manifest_dir) | 724 | self.manifest = OpkgManifest(d, manifest_dir) |
@@ -857,13 +912,24 @@ class OpkgRootfs(DpkgOpkgRootfs): | |||
857 | 912 | ||
858 | execute_pre_post_process(self.d, opkg_pre_process_cmds) | 913 | execute_pre_post_process(self.d, opkg_pre_process_cmds) |
859 | 914 | ||
915 | if self.progress_reporter: | ||
916 | self.progress_reporter.next_stage() | ||
917 | # Steps are a bit different in order, skip next | ||
918 | self.progress_reporter.next_stage() | ||
919 | |||
860 | self.pm.update() | 920 | self.pm.update() |
861 | 921 | ||
862 | self.pm.handle_bad_recommendations() | 922 | self.pm.handle_bad_recommendations() |
863 | 923 | ||
924 | if self.progress_reporter: | ||
925 | self.progress_reporter.next_stage() | ||
926 | |||
864 | if self.inc_opkg_image_gen == "1": | 927 | if self.inc_opkg_image_gen == "1": |
865 | self._remove_extra_packages(pkgs_to_install) | 928 | self._remove_extra_packages(pkgs_to_install) |
866 | 929 | ||
930 | if self.progress_reporter: | ||
931 | self.progress_reporter.next_stage() | ||
932 | |||
867 | for pkg_type in self.install_order: | 933 | for pkg_type in self.install_order: |
868 | if pkg_type in pkgs_to_install: | 934 | if pkg_type in pkgs_to_install: |
869 | # For multilib, we perform a sanity test before final install | 935 | # For multilib, we perform a sanity test before final install |
@@ -875,8 +941,14 @@ class OpkgRootfs(DpkgOpkgRootfs): | |||
875 | self.pm.install(pkgs_to_install[pkg_type], | 941 | self.pm.install(pkgs_to_install[pkg_type], |
876 | [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY]) | 942 | [False, True][pkg_type == Manifest.PKG_TYPE_ATTEMPT_ONLY]) |
877 | 943 | ||
944 | if self.progress_reporter: | ||
945 | self.progress_reporter.next_stage() | ||
946 | |||
878 | self.pm.install_complementary() | 947 | self.pm.install_complementary() |
879 | 948 | ||
949 | if self.progress_reporter: | ||
950 | self.progress_reporter.next_stage() | ||
951 | |||
880 | self._setup_dbg_rootfs(['/etc', '/var/lib/opkg', '/usr/lib/ssl']) | 952 | self._setup_dbg_rootfs(['/etc', '/var/lib/opkg', '/usr/lib/ssl']) |
881 | 953 | ||
882 | execute_pre_post_process(self.d, opkg_post_process_cmds) | 954 | execute_pre_post_process(self.d, opkg_post_process_cmds) |
@@ -884,6 +956,9 @@ class OpkgRootfs(DpkgOpkgRootfs): | |||
884 | if self.inc_opkg_image_gen == "1": | 956 | if self.inc_opkg_image_gen == "1": |
885 | self.pm.backup_packaging_data() | 957 | self.pm.backup_packaging_data() |
886 | 958 | ||
959 | if self.progress_reporter: | ||
960 | self.progress_reporter.next_stage() | ||
961 | |||
887 | @staticmethod | 962 | @staticmethod |
888 | def _depends_list(): | 963 | def _depends_list(): |
889 | return ['IPKGCONF_SDK', 'IPK_FEED_URIS', 'DEPLOY_DIR_IPK', 'IPKGCONF_TARGET', 'INC_IPK_IMAGE_GEN', 'OPKG_ARGS', 'OPKGLIBDIR', 'OPKG_PREPROCESS_COMMANDS', 'OPKG_POSTPROCESS_COMMANDS', 'OPKGLIBDIR'] | 964 | return ['IPKGCONF_SDK', 'IPK_FEED_URIS', 'DEPLOY_DIR_IPK', 'IPKGCONF_TARGET', 'INC_IPK_IMAGE_GEN', 'OPKG_ARGS', 'OPKGLIBDIR', 'OPKG_PREPROCESS_COMMANDS', 'OPKG_POSTPROCESS_COMMANDS', 'OPKGLIBDIR'] |
@@ -919,16 +994,16 @@ def variable_depends(d, manifest_dir=None): | |||
919 | cls = get_class_for_type(img_type) | 994 | cls = get_class_for_type(img_type) |
920 | return cls._depends_list() | 995 | return cls._depends_list() |
921 | 996 | ||
922 | def create_rootfs(d, manifest_dir=None): | 997 | def create_rootfs(d, manifest_dir=None, progress_reporter=None): |
923 | env_bkp = os.environ.copy() | 998 | env_bkp = os.environ.copy() |
924 | 999 | ||
925 | img_type = d.getVar('IMAGE_PKGTYPE', True) | 1000 | img_type = d.getVar('IMAGE_PKGTYPE', True) |
926 | if img_type == "rpm": | 1001 | if img_type == "rpm": |
927 | RpmRootfs(d, manifest_dir).create() | 1002 | RpmRootfs(d, manifest_dir, progress_reporter).create() |
928 | elif img_type == "ipk": | 1003 | elif img_type == "ipk": |
929 | OpkgRootfs(d, manifest_dir).create() | 1004 | OpkgRootfs(d, manifest_dir, progress_reporter).create() |
930 | elif img_type == "deb": | 1005 | elif img_type == "deb": |
931 | DpkgRootfs(d, manifest_dir).create() | 1006 | DpkgRootfs(d, manifest_dir, progress_reporter).create() |
932 | 1007 | ||
933 | os.environ.clear() | 1008 | os.environ.clear() |
934 | os.environ.update(env_bkp) | 1009 | os.environ.update(env_bkp) |