diff options
Diffstat (limited to 'meta/classes/buildhistory.bbclass')
-rw-r--r-- | meta/classes/buildhistory.bbclass | 135 |
1 files changed, 45 insertions, 90 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass index fd53e92402..4a380c10c6 100644 --- a/meta/classes/buildhistory.bbclass +++ b/meta/classes/buildhistory.bbclass | |||
@@ -16,28 +16,6 @@ BUILDHISTORY_DIR ?= "${TOPDIR}/buildhistory" | |||
16 | BUILDHISTORY_DIR_IMAGE = "${BUILDHISTORY_DIR}/images/${MACHINE_ARCH}/${TCLIBC}/${IMAGE_BASENAME}" | 16 | BUILDHISTORY_DIR_IMAGE = "${BUILDHISTORY_DIR}/images/${MACHINE_ARCH}/${TCLIBC}/${IMAGE_BASENAME}" |
17 | BUILDHISTORY_DIR_PACKAGE = "${BUILDHISTORY_DIR}/packages/${MULTIMACH_TARGET_SYS}/${PN}" | 17 | BUILDHISTORY_DIR_PACKAGE = "${BUILDHISTORY_DIR}/packages/${MULTIMACH_TARGET_SYS}/${PN}" |
18 | 18 | ||
19 | # Setting this to non-empty will remove the old content of the buildhistory as part of | ||
20 | # the current bitbake invocation and replace it with information about what was built | ||
21 | # during the build. | ||
22 | # | ||
23 | # This is meant to be used in continuous integration (CI) systems when invoking bitbake | ||
24 | # for full world builds. The effect in that case is that information about packages | ||
25 | # that no longer get build also gets removed from the buildhistory, which is not | ||
26 | # the case otherwise. | ||
27 | # | ||
28 | # The advantage over manually cleaning the buildhistory outside of bitbake is that | ||
29 | # the "version-going-backwards" check still works. When relying on that, be careful | ||
30 | # about failed world builds: they will lead to incomplete information in the | ||
31 | # buildhistory because information about packages that could not be built will | ||
32 | # also get removed. A CI system should handle that by discarding the buildhistory | ||
33 | # of failed builds. | ||
34 | # | ||
35 | # The expected usage is via auto.conf, but passing via the command line also works | ||
36 | # with: BB_ENV_PASSTHROUGH_ADDITIONS=BUILDHISTORY_RESET BUILDHISTORY_RESET=1 | ||
37 | BUILDHISTORY_RESET ?= "" | ||
38 | |||
39 | BUILDHISTORY_OLD_DIR = "${BUILDHISTORY_DIR}/${@ "old" if "${BUILDHISTORY_RESET}" else ""}" | ||
40 | BUILDHISTORY_OLD_DIR_PACKAGE = "${BUILDHISTORY_OLD_DIR}/packages/${MULTIMACH_TARGET_SYS}/${PN}" | ||
41 | BUILDHISTORY_DIR_SDK = "${BUILDHISTORY_DIR}/sdk/${SDK_NAME}${SDK_EXT}/${IMAGE_BASENAME}" | 19 | BUILDHISTORY_DIR_SDK = "${BUILDHISTORY_DIR}/sdk/${SDK_NAME}${SDK_EXT}/${IMAGE_BASENAME}" |
42 | BUILDHISTORY_IMAGE_FILES ?= "/etc/passwd /etc/group" | 20 | BUILDHISTORY_IMAGE_FILES ?= "/etc/passwd /etc/group" |
43 | BUILDHISTORY_SDK_FILES ?= "conf/local.conf conf/bblayers.conf conf/auto.conf conf/locked-sigs.inc conf/devtool.conf" | 21 | BUILDHISTORY_SDK_FILES ?= "conf/local.conf conf/bblayers.conf conf/auto.conf conf/locked-sigs.inc conf/devtool.conf" |
@@ -47,25 +25,33 @@ BUILDHISTORY_PUSH_REPO ?= "" | |||
47 | BUILDHISTORY_TAG ?= "build" | 25 | BUILDHISTORY_TAG ?= "build" |
48 | BUILDHISTORY_PATH_PREFIX_STRIP ?= "" | 26 | BUILDHISTORY_PATH_PREFIX_STRIP ?= "" |
49 | 27 | ||
50 | SSTATEPOSTINSTFUNCS:append = " buildhistory_emit_pkghistory" | 28 | # We want to avoid influencing the signatures of the task so use vardepsexclude |
51 | # We want to avoid influencing the signatures of sstate tasks - first the function itself: | 29 | do_populate_sysroot[postfuncs] += "buildhistory_emit_sysroot" |
52 | sstate_install[vardepsexclude] += "buildhistory_emit_pkghistory" | 30 | do_populate_sysroot_setscene[postfuncs] += "buildhistory_emit_sysroot" |
53 | # then the value added to SSTATEPOSTINSTFUNCS: | 31 | do_populate_sysroot[vardepsexclude] += "buildhistory_emit_sysroot" |
54 | SSTATEPOSTINSTFUNCS[vardepvalueexclude] .= "| buildhistory_emit_pkghistory" | 32 | |
33 | do_package[postfuncs] += "buildhistory_list_pkg_files" | ||
34 | do_package_setscene[postfuncs] += "buildhistory_list_pkg_files" | ||
35 | do_package[vardepsexclude] += "buildhistory_list_pkg_files" | ||
36 | |||
37 | do_packagedata[postfuncs] += "buildhistory_emit_pkghistory" | ||
38 | do_packagedata_setscene[postfuncs] += "buildhistory_emit_pkghistory" | ||
39 | do_packagedata[vardepsexclude] += "buildhistory_emit_pkghistory" | ||
55 | 40 | ||
56 | # Similarly for our function that gets the output signatures | 41 | # Similarly for our function that gets the output signatures |
57 | SSTATEPOSTUNPACKFUNCS:append = " buildhistory_emit_outputsigs" | 42 | SSTATEPOSTUNPACKFUNCS:append = " buildhistory_emit_outputsigs" |
58 | sstate_installpkgdir[vardepsexclude] += "buildhistory_emit_outputsigs" | 43 | sstate_installpkgdir[vardepsexclude] += "buildhistory_emit_outputsigs" |
59 | SSTATEPOSTUNPACKFUNCS[vardepvalueexclude] .= "| buildhistory_emit_outputsigs" | 44 | SSTATEPOSTUNPACKFUNCS[vardepvalueexclude] .= "| buildhistory_emit_outputsigs" |
60 | 45 | ||
61 | # All items excepts those listed here will be removed from a recipe's | 46 | # All items except those listed here will be removed from a recipe's |
62 | # build history directory by buildhistory_emit_pkghistory(). This is | 47 | # build history directory by buildhistory_emit_pkghistory(). This is |
63 | # necessary because some of these items (package directories, files that | 48 | # necessary because some of these items (package directories, files that |
64 | # we no longer emit) might be obsolete. | 49 | # we no longer emit) might be obsolete. |
65 | # | 50 | # |
66 | # When extending build history, derive your class from buildhistory.bbclass | 51 | # The files listed here are either written by tasks that aren't do_package (e.g. |
67 | # and extend this list here with the additional files created by the derived | 52 | # latest_srcrev from do_fetch) so do_package must not remove them, or, they're |
68 | # class. | 53 | # used to read values in do_package before always being overwritten, e.g. latest, |
54 | # for version backwards checks. | ||
69 | BUILDHISTORY_PRESERVE = "latest latest_srcrev sysroot" | 55 | BUILDHISTORY_PRESERVE = "latest latest_srcrev sysroot" |
70 | 56 | ||
71 | PATCH_GIT_USER_EMAIL ?= "buildhistory@oe" | 57 | PATCH_GIT_USER_EMAIL ?= "buildhistory@oe" |
@@ -91,28 +77,16 @@ buildhistory_emit_sysroot() { | |||
91 | # Write out metadata about this package for comparison when writing future packages | 77 | # Write out metadata about this package for comparison when writing future packages |
92 | # | 78 | # |
93 | python buildhistory_emit_pkghistory() { | 79 | python buildhistory_emit_pkghistory() { |
94 | if d.getVar('BB_CURRENTTASK') in ['populate_sysroot', 'populate_sysroot_setscene']: | ||
95 | bb.build.exec_func("buildhistory_emit_sysroot", d) | ||
96 | return 0 | ||
97 | |||
98 | if not "package" in (d.getVar('BUILDHISTORY_FEATURES') or "").split(): | ||
99 | return 0 | ||
100 | |||
101 | if d.getVar('BB_CURRENTTASK') in ['package', 'package_setscene']: | ||
102 | # Create files-in-<package-name>.txt files containing a list of files of each recipe's package | ||
103 | bb.build.exec_func("buildhistory_list_pkg_files", d) | ||
104 | return 0 | ||
105 | |||
106 | if not d.getVar('BB_CURRENTTASK') in ['packagedata', 'packagedata_setscene']: | ||
107 | return 0 | ||
108 | |||
109 | import re | 80 | import re |
110 | import json | 81 | import json |
111 | import shlex | 82 | import shlex |
112 | import errno | 83 | import errno |
84 | import shutil | ||
85 | |||
86 | if not "package" in (d.getVar('BUILDHISTORY_FEATURES') or "").split(): | ||
87 | return 0 | ||
113 | 88 | ||
114 | pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE') | 89 | pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE') |
115 | oldpkghistdir = d.getVar('BUILDHISTORY_OLD_DIR_PACKAGE') | ||
116 | 90 | ||
117 | class RecipeInfo: | 91 | class RecipeInfo: |
118 | def __init__(self, name): | 92 | def __init__(self, name): |
@@ -153,7 +127,7 @@ python buildhistory_emit_pkghistory() { | |||
153 | # Variables that need to be written to their own separate file | 127 | # Variables that need to be written to their own separate file |
154 | self.filevars = dict.fromkeys(['pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm']) | 128 | self.filevars = dict.fromkeys(['pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm']) |
155 | 129 | ||
156 | # Should check PACKAGES here to see if anything removed | 130 | # Should check PACKAGES here to see if anything was removed |
157 | 131 | ||
158 | def readPackageInfo(pkg, histfile): | 132 | def readPackageInfo(pkg, histfile): |
159 | pkginfo = PackageInfo(pkg) | 133 | pkginfo = PackageInfo(pkg) |
@@ -207,7 +181,7 @@ python buildhistory_emit_pkghistory() { | |||
207 | 181 | ||
208 | def getlastpkgversion(pkg): | 182 | def getlastpkgversion(pkg): |
209 | try: | 183 | try: |
210 | histfile = os.path.join(oldpkghistdir, pkg, "latest") | 184 | histfile = os.path.join(pkghistdir, pkg, "latest") |
211 | return readPackageInfo(pkg, histfile) | 185 | return readPackageInfo(pkg, histfile) |
212 | except EnvironmentError: | 186 | except EnvironmentError: |
213 | return None | 187 | return None |
@@ -535,7 +509,7 @@ buildhistory_get_installed() { | |||
535 | grep -v kernel-module $1/depends-nokernel-nolibc-noupdate.dot > $1/depends-nokernel-nolibc-noupdate-nomodules.dot | 509 | grep -v kernel-module $1/depends-nokernel-nolibc-noupdate.dot > $1/depends-nokernel-nolibc-noupdate-nomodules.dot |
536 | fi | 510 | fi |
537 | 511 | ||
538 | # add complementary package information | 512 | # Add complementary package information |
539 | if [ -e ${WORKDIR}/complementary_pkgs.txt ]; then | 513 | if [ -e ${WORKDIR}/complementary_pkgs.txt ]; then |
540 | cp ${WORKDIR}/complementary_pkgs.txt $1 | 514 | cp ${WORKDIR}/complementary_pkgs.txt $1 |
541 | fi | 515 | fi |
@@ -573,7 +547,7 @@ buildhistory_get_sdk_installed_target() { | |||
573 | 547 | ||
574 | buildhistory_list_files() { | 548 | buildhistory_list_files() { |
575 | # List the files in the specified directory, but exclude date/time etc. | 549 | # List the files in the specified directory, but exclude date/time etc. |
576 | # This is somewhat messy, but handles where the size is not printed for device files under pseudo | 550 | # This is somewhat messy, but handles cases where the size is not printed for device files under pseudo |
577 | ( cd $1 | 551 | ( cd $1 |
578 | find_cmd='find . ! -path . -printf "%M %-10u %-10g %10s %p -> %l\n"' | 552 | find_cmd='find . ! -path . -printf "%M %-10u %-10g %10s %p -> %l\n"' |
579 | if [ "$3" = "fakeroot" ] ; then | 553 | if [ "$3" = "fakeroot" ] ; then |
@@ -587,7 +561,7 @@ buildhistory_list_files_no_owners() { | |||
587 | # List the files in the specified directory, but exclude date/time etc. | 561 | # List the files in the specified directory, but exclude date/time etc. |
588 | # Also don't output the ownership data, but instead output just - - so | 562 | # Also don't output the ownership data, but instead output just - - so |
589 | # that the same parsing code as for _list_files works. | 563 | # that the same parsing code as for _list_files works. |
590 | # This is somewhat messy, but handles where the size is not printed for device files under pseudo | 564 | # This is somewhat messy, but handles cases where the size is not printed for device files under pseudo |
591 | ( cd $1 | 565 | ( cd $1 |
592 | find_cmd='find . ! -path . -printf "%M - - %10s %p -> %l\n"' | 566 | find_cmd='find . ! -path . -printf "%M - - %10s %p -> %l\n"' |
593 | if [ "$3" = "fakeroot" ] ; then | 567 | if [ "$3" = "fakeroot" ] ; then |
@@ -598,16 +572,17 @@ buildhistory_list_files_no_owners() { | |||
598 | } | 572 | } |
599 | 573 | ||
600 | buildhistory_list_pkg_files() { | 574 | buildhistory_list_pkg_files() { |
575 | if [ "${@bb.utils.contains('BUILDHISTORY_FEATURES', 'package', '1', '0', d)}" = "0" ] ; then | ||
576 | return | ||
577 | fi | ||
578 | |||
601 | # Create individual files-in-package for each recipe's package | 579 | # Create individual files-in-package for each recipe's package |
602 | for pkgdir in $(find ${PKGDEST}/* -maxdepth 0 -type d); do | 580 | pkgdirlist=$(find ${PKGDEST}/* -maxdepth 0 -type d) |
581 | for pkgdir in $pkgdirlist; do | ||
603 | pkgname=$(basename $pkgdir) | 582 | pkgname=$(basename $pkgdir) |
604 | outfolder="${BUILDHISTORY_DIR_PACKAGE}/$pkgname" | 583 | outfolder="${BUILDHISTORY_DIR_PACKAGE}/$pkgname" |
605 | outfile="$outfolder/files-in-package.txt" | 584 | outfile="$outfolder/files-in-package.txt" |
606 | # Make sure the output folder exists so we can create the file | 585 | mkdir -p $outfolder |
607 | if [ ! -d $outfolder ] ; then | ||
608 | bbdebug 2 "Folder $outfolder does not exist, file $outfile not created" | ||
609 | continue | ||
610 | fi | ||
611 | buildhistory_list_files $pkgdir $outfile fakeroot | 586 | buildhistory_list_files $pkgdir $outfile fakeroot |
612 | done | 587 | done |
613 | } | 588 | } |
@@ -842,9 +817,9 @@ END | |||
842 | if [ ! -e .git ] ; then | 817 | if [ ! -e .git ] ; then |
843 | git init -q | 818 | git init -q |
844 | else | 819 | else |
845 | git tag -f ${BUILDHISTORY_TAG}-minus-3 ${BUILDHISTORY_TAG}-minus-2 > /dev/null 2>&1 || true | 820 | git tag -f --no-sign ${BUILDHISTORY_TAG}-minus-3 ${BUILDHISTORY_TAG}-minus-2 > /dev/null 2>&1 || true |
846 | git tag -f ${BUILDHISTORY_TAG}-minus-2 ${BUILDHISTORY_TAG}-minus-1 > /dev/null 2>&1 || true | 821 | git tag -f --no-sign ${BUILDHISTORY_TAG}-minus-2 ${BUILDHISTORY_TAG}-minus-1 > /dev/null 2>&1 || true |
847 | git tag -f ${BUILDHISTORY_TAG}-minus-1 > /dev/null 2>&1 || true | 822 | git tag -f --no-sign ${BUILDHISTORY_TAG}-minus-1 > /dev/null 2>&1 || true |
848 | fi | 823 | fi |
849 | 824 | ||
850 | check_git_config | 825 | check_git_config |
@@ -855,10 +830,9 @@ END | |||
855 | CMDLINE="${@buildhistory_get_cmdline(d)}" | 830 | CMDLINE="${@buildhistory_get_cmdline(d)}" |
856 | if [ "$repostatus" != "" ] ; then | 831 | if [ "$repostatus" != "" ] ; then |
857 | git add -A . | 832 | git add -A . |
858 | # porcelain output looks like "?? packages/foo/bar" | 833 | # Porcelain output looks like "?? packages/foo/bar" |
859 | # Ensure we commit metadata-revs with the first commit | 834 | # Ensure we commit metadata-revs with the first commit |
860 | buildhistory_single_commit "$CMDLINE" "$HOSTNAME" dummy | 835 | buildhistory_single_commit "$CMDLINE" "$HOSTNAME" dummy |
861 | git gc --auto --quiet | ||
862 | else | 836 | else |
863 | buildhistory_single_commit "$CMDLINE" "$HOSTNAME" | 837 | buildhistory_single_commit "$CMDLINE" "$HOSTNAME" |
864 | fi | 838 | fi |
@@ -869,25 +843,7 @@ END | |||
869 | 843 | ||
870 | python buildhistory_eventhandler() { | 844 | python buildhistory_eventhandler() { |
871 | if (e.data.getVar('BUILDHISTORY_FEATURES') or "").strip(): | 845 | if (e.data.getVar('BUILDHISTORY_FEATURES') or "").strip(): |
872 | reset = e.data.getVar("BUILDHISTORY_RESET") | 846 | if isinstance(e, bb.event.BuildCompleted): |
873 | olddir = e.data.getVar("BUILDHISTORY_OLD_DIR") | ||
874 | if isinstance(e, bb.event.BuildStarted): | ||
875 | if reset: | ||
876 | import shutil | ||
877 | # Clean up after potentially interrupted build. | ||
878 | if os.path.isdir(olddir): | ||
879 | shutil.rmtree(olddir) | ||
880 | rootdir = e.data.getVar("BUILDHISTORY_DIR") | ||
881 | bb.utils.mkdirhier(rootdir) | ||
882 | entries = [ x for x in os.listdir(rootdir) if not x.startswith('.') ] | ||
883 | bb.utils.mkdirhier(olddir) | ||
884 | for entry in entries: | ||
885 | bb.utils.rename(os.path.join(rootdir, entry), | ||
886 | os.path.join(olddir, entry)) | ||
887 | elif isinstance(e, bb.event.BuildCompleted): | ||
888 | if reset: | ||
889 | import shutil | ||
890 | shutil.rmtree(olddir) | ||
891 | if e.data.getVar("BUILDHISTORY_COMMIT") == "1": | 847 | if e.data.getVar("BUILDHISTORY_COMMIT") == "1": |
892 | bb.note("Writing buildhistory") | 848 | bb.note("Writing buildhistory") |
893 | bb.build.exec_func("buildhistory_write_sigs", d) | 849 | bb.build.exec_func("buildhistory_write_sigs", d) |
@@ -925,13 +881,12 @@ def _get_srcrev_values(d): | |||
925 | dict_tag_srcrevs = {} | 881 | dict_tag_srcrevs = {} |
926 | for scm in scms: | 882 | for scm in scms: |
927 | ud = urldata[scm] | 883 | ud = urldata[scm] |
928 | for name in ud.names: | 884 | autoinc, rev = ud.method.sortable_revision(ud, d, ud.name) |
929 | autoinc, rev = ud.method.sortable_revision(ud, d, name) | 885 | dict_srcrevs[ud.name] = rev |
930 | dict_srcrevs[name] = rev | 886 | if 'tag' in ud.parm: |
931 | if 'tag' in ud.parm: | 887 | tag = ud.parm['tag']; |
932 | tag = ud.parm['tag']; | 888 | key = ud.name+'_'+tag |
933 | key = name+'_'+tag | 889 | dict_tag_srcrevs[key] = rev |
934 | dict_tag_srcrevs[key] = rev | ||
935 | return (dict_srcrevs, dict_tag_srcrevs) | 890 | return (dict_srcrevs, dict_tag_srcrevs) |
936 | 891 | ||
937 | do_fetch[postfuncs] += "write_srcrev" | 892 | do_fetch[postfuncs] += "write_srcrev" |
@@ -990,7 +945,7 @@ def write_latest_ptest_result(d, histdir): | |||
990 | output_ptest = os.path.join(histdir, 'ptest') | 945 | output_ptest = os.path.join(histdir, 'ptest') |
991 | if os.path.exists(input_ptest): | 946 | if os.path.exists(input_ptest): |
992 | try: | 947 | try: |
993 | # Lock it avoid race issue | 948 | # Lock it to avoid race issue |
994 | lock = bb.utils.lockfile(output_ptest + "/ptest.lock") | 949 | lock = bb.utils.lockfile(output_ptest + "/ptest.lock") |
995 | bb.utils.mkdirhier(output_ptest) | 950 | bb.utils.mkdirhier(output_ptest) |
996 | oe.path.copytree(input_ptest, output_ptest) | 951 | oe.path.copytree(input_ptest, output_ptest) |