diff options
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/classes/buildhistory.bbclass | 74 |
1 files changed, 6 insertions, 68 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass index e970182620..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" |
| @@ -70,9 +48,10 @@ SSTATEPOSTUNPACKFUNCS[vardepvalueexclude] .= "| buildhistory_emit_outputsigs" | |||
| 70 | # necessary because some of these items (package directories, files that | 48 | # necessary because some of these items (package directories, files that |
| 71 | # we no longer emit) might be obsolete. | 49 | # we no longer emit) might be obsolete. |
| 72 | # | 50 | # |
| 73 | # 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. |
| 74 | # 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 |
| 75 | # class. | 53 | # used to read values in do_package before always being overwritten, e.g. latest, |
| 54 | # for version backwards checks. | ||
| 76 | BUILDHISTORY_PRESERVE = "latest latest_srcrev sysroot" | 55 | BUILDHISTORY_PRESERVE = "latest latest_srcrev sysroot" |
| 77 | 56 | ||
| 78 | PATCH_GIT_USER_EMAIL ?= "buildhistory@oe" | 57 | PATCH_GIT_USER_EMAIL ?= "buildhistory@oe" |
| @@ -108,7 +87,6 @@ python buildhistory_emit_pkghistory() { | |||
| 108 | return 0 | 87 | return 0 |
| 109 | 88 | ||
| 110 | pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE') | 89 | pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE') |
| 111 | oldpkghistdir = d.getVar('BUILDHISTORY_OLD_DIR_PACKAGE') | ||
| 112 | 90 | ||
| 113 | class RecipeInfo: | 91 | class RecipeInfo: |
| 114 | def __init__(self, name): | 92 | def __init__(self, name): |
| @@ -203,7 +181,7 @@ python buildhistory_emit_pkghistory() { | |||
| 203 | 181 | ||
| 204 | def getlastpkgversion(pkg): | 182 | def getlastpkgversion(pkg): |
| 205 | try: | 183 | try: |
| 206 | histfile = os.path.join(oldpkghistdir, pkg, "latest") | 184 | histfile = os.path.join(pkghistdir, pkg, "latest") |
| 207 | return readPackageInfo(pkg, histfile) | 185 | return readPackageInfo(pkg, histfile) |
| 208 | except EnvironmentError: | 186 | except EnvironmentError: |
| 209 | return None | 187 | return None |
| @@ -219,20 +197,6 @@ python buildhistory_emit_pkghistory() { | |||
| 219 | items.sort() | 197 | items.sort() |
| 220 | return ' '.join(items) | 198 | return ' '.join(items) |
| 221 | 199 | ||
| 222 | def preservebuildhistoryfiles(pkg, preserve): | ||
| 223 | if os.path.exists(os.path.join(oldpkghistdir, pkg)): | ||
| 224 | listofobjs = os.listdir(os.path.join(oldpkghistdir, pkg)) | ||
| 225 | for obj in listofobjs: | ||
| 226 | if obj not in preserve: | ||
| 227 | continue | ||
| 228 | try: | ||
| 229 | bb.utils.mkdirhier(os.path.join(pkghistdir, pkg)) | ||
| 230 | shutil.copyfile(os.path.join(oldpkghistdir, pkg, obj), os.path.join(pkghistdir, pkg, obj)) | ||
| 231 | except IOError as e: | ||
| 232 | bb.note("Unable to copy file. %s" % e) | ||
| 233 | except EnvironmentError as e: | ||
| 234 | bb.note("Unable to copy file. %s" % e) | ||
| 235 | |||
| 236 | pn = d.getVar('PN') | 200 | pn = d.getVar('PN') |
| 237 | pe = d.getVar('PE') or "0" | 201 | pe = d.getVar('PE') or "0" |
| 238 | pv = d.getVar('PV') | 202 | pv = d.getVar('PV') |
| @@ -260,14 +224,6 @@ python buildhistory_emit_pkghistory() { | |||
| 260 | if not os.path.exists(pkghistdir): | 224 | if not os.path.exists(pkghistdir): |
| 261 | bb.utils.mkdirhier(pkghistdir) | 225 | bb.utils.mkdirhier(pkghistdir) |
| 262 | else: | 226 | else: |
| 263 | # We need to make sure that all files kept in | ||
| 264 | # buildhistory/old are restored successfully | ||
| 265 | # otherwise next block of code wont have files to | ||
| 266 | # check and purge | ||
| 267 | if d.getVar("BUILDHISTORY_RESET"): | ||
| 268 | for pkg in packagelist: | ||
| 269 | preservebuildhistoryfiles(pkg, preserve) | ||
| 270 | |||
| 271 | # Remove files for packages that no longer exist | 227 | # Remove files for packages that no longer exist |
| 272 | for item in os.listdir(pkghistdir): | 228 | for item in os.listdir(pkghistdir): |
| 273 | if item not in preserve: | 229 | if item not in preserve: |
| @@ -887,25 +843,7 @@ END | |||
| 887 | 843 | ||
| 888 | python buildhistory_eventhandler() { | 844 | python buildhistory_eventhandler() { |
| 889 | if (e.data.getVar('BUILDHISTORY_FEATURES') or "").strip(): | 845 | if (e.data.getVar('BUILDHISTORY_FEATURES') or "").strip(): |
| 890 | reset = e.data.getVar("BUILDHISTORY_RESET") | 846 | if isinstance(e, bb.event.BuildCompleted): |
| 891 | olddir = e.data.getVar("BUILDHISTORY_OLD_DIR") | ||
| 892 | if isinstance(e, bb.event.BuildStarted): | ||
| 893 | if reset: | ||
| 894 | import shutil | ||
| 895 | # Clean up after potentially interrupted build. | ||
| 896 | if os.path.isdir(olddir): | ||
| 897 | shutil.rmtree(olddir) | ||
| 898 | rootdir = e.data.getVar("BUILDHISTORY_DIR") | ||
| 899 | bb.utils.mkdirhier(rootdir) | ||
| 900 | entries = [ x for x in os.listdir(rootdir) if not x.startswith('.') ] | ||
| 901 | bb.utils.mkdirhier(olddir) | ||
| 902 | for entry in entries: | ||
| 903 | bb.utils.rename(os.path.join(rootdir, entry), | ||
| 904 | os.path.join(olddir, entry)) | ||
| 905 | elif isinstance(e, bb.event.BuildCompleted): | ||
| 906 | if reset: | ||
| 907 | import shutil | ||
| 908 | shutil.rmtree(olddir) | ||
| 909 | if e.data.getVar("BUILDHISTORY_COMMIT") == "1": | 847 | if e.data.getVar("BUILDHISTORY_COMMIT") == "1": |
| 910 | bb.note("Writing buildhistory") | 848 | bb.note("Writing buildhistory") |
| 911 | bb.build.exec_func("buildhistory_write_sigs", d) | 849 | bb.build.exec_func("buildhistory_write_sigs", d) |
