summaryrefslogtreecommitdiffstats
path: root/meta/classes/buildhistory.bbclass
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2013-03-22 19:53:52 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-03-23 11:41:13 +0000
commit59e48153877269d5eea393ad2f6d1827f74720ac (patch)
tree1fc56600125082af451cf86c0c1347804bad36e7 /meta/classes/buildhistory.bbclass
parent9e366e153234114ab3c51e4bb8e3452593f64070 (diff)
downloadpoky-59e48153877269d5eea393ad2f6d1827f74720ac.tar.gz
classes/buildhistory: implement history collection for SDKs
SDKs are constructed in a similar manner to images, and the contents can be influenced by a number of different factors, thus tracking the contents of produced SDKs when buildhistory is enabled can help detect the same kinds of issues as with images. This required adding POPULATE_SDK_POST_HOST_COMMAND and SDK_POSTPROCESS_COMMAND variables so that data collection functions can be injected at the appropriate points in the SDK construction process, as well as moving the list_installed_packages and rootfs_list_installed_depends functions from the rootfs_{rpm,ipk,deb} to the package_{rpm,ipk,deb} classes so they can also be called during do_populate_sdk as well as do_rootfs. Implements [YOCTO #3964]. (From OE-Core rev: c3736064483d4840e38cb1b8c13d2dd3a26b36aa) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/buildhistory.bbclass')
-rw-r--r--meta/classes/buildhistory.bbclass130
1 files changed, 90 insertions, 40 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index 07b3c1edaf..b559ebf8ac 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -3,14 +3,15 @@
3# 3#
4# Based in part on testlab.bbclass and packagehistory.bbclass 4# Based in part on testlab.bbclass and packagehistory.bbclass
5# 5#
6# Copyright (C) 2011 Intel Corporation 6# Copyright (C) 2013 Intel Corporation
7# Copyright (C) 2007-2011 Koen Kooi <koen@openembedded.org> 7# Copyright (C) 2007-2011 Koen Kooi <koen@openembedded.org>
8# 8#
9 9
10BUILDHISTORY_FEATURES ?= "image package" 10BUILDHISTORY_FEATURES ?= "image package sdk"
11BUILDHISTORY_DIR ?= "${TMPDIR}/buildhistory" 11BUILDHISTORY_DIR ?= "${TMPDIR}/buildhistory"
12BUILDHISTORY_DIR_IMAGE = "${BUILDHISTORY_DIR}/images/${MACHINE_ARCH}/${TCLIBC}/${IMAGE_BASENAME}" 12BUILDHISTORY_DIR_IMAGE = "${BUILDHISTORY_DIR}/images/${MACHINE_ARCH}/${TCLIBC}/${IMAGE_BASENAME}"
13BUILDHISTORY_DIR_PACKAGE = "${BUILDHISTORY_DIR}/packages/${MULTIMACH_TARGET_SYS}/${PN}" 13BUILDHISTORY_DIR_PACKAGE = "${BUILDHISTORY_DIR}/packages/${MULTIMACH_TARGET_SYS}/${PN}"
14BUILDHISTORY_DIR_SDK = "${BUILDHISTORY_DIR}/sdk/${SDK_NAME}"
14BUILDHISTORY_COMMIT ?= "0" 15BUILDHISTORY_COMMIT ?= "0"
15BUILDHISTORY_COMMIT_AUTHOR ?= "buildhistory <buildhistory@${DISTRO}>" 16BUILDHISTORY_COMMIT_AUTHOR ?= "buildhistory <buildhistory@${DISTRO}>"
16BUILDHISTORY_PUSH_REPO ?= "" 17BUILDHISTORY_PUSH_REPO ?= ""
@@ -315,69 +316,91 @@ def write_pkghistory(pkginfo, d):
315 os.unlink(filevarpath) 316 os.unlink(filevarpath)
316 317
317 318
318buildhistory_get_image_installed() { 319buildhistory_get_installed() {
319 # Anything requiring the use of the packaging system should be done in here 320 mkdir -p $1
320 # in case the packaging files are going to be removed for this image
321
322 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'image', '1', '0', d)}" = "0" ] ; then
323 return
324 fi
325
326 mkdir -p ${BUILDHISTORY_DIR_IMAGE}
327 321
328 # Get list of installed packages 322 # Get list of installed packages
329 pkgcache="${BUILDHISTORY_DIR_IMAGE}/installed-packages.tmp" 323 pkgcache="$1/installed-packages.tmp"
330 list_installed_packages file | sort > $pkgcache 324 list_installed_packages file | sort > $pkgcache
331 325
332 cat $pkgcache | awk '{ print $1 }' > ${BUILDHISTORY_DIR_IMAGE}/installed-package-names.txt 326 cat $pkgcache | awk '{ print $1 }' > $1/installed-package-names.txt
333 cat $pkgcache | awk '{ print $2 }' | xargs -n1 basename > ${BUILDHISTORY_DIR_IMAGE}/installed-packages.txt 327 cat $pkgcache | awk '{ print $2 }' | xargs -n1 basename > $1/installed-packages.txt
334 328
335 # Produce dependency graph 329 # Produce dependency graph
336 # First, filter out characters that cause issues for dot 330 # First, filter out characters that cause issues for dot
337 rootfs_list_installed_depends | sed -e 's:-:_:g' -e 's:\.:_:g' -e 's:+::g' > ${BUILDHISTORY_DIR_IMAGE}/depends.tmp 331 rootfs_list_installed_depends | sed -e 's:-:_:g' -e 's:\.:_:g' -e 's:+::g' > $1/depends.tmp
338 # Change delimiter from pipe to -> and set style for recommend lines 332 # Change delimiter from pipe to -> and set style for recommend lines
339 sed -i -e 's:|: -> :' -e 's:\[REC\]:[style=dotted]:' -e 's:$:;:' ${BUILDHISTORY_DIR_IMAGE}/depends.tmp 333 sed -i -e 's:|: -> :' -e 's:\[REC\]:[style=dotted]:' -e 's:$:;:' $1/depends.tmp
340 # Add header, sorted and de-duped contents and footer and then delete the temp file 334 # Add header, sorted and de-duped contents and footer and then delete the temp file
341 printf "digraph depends {\n node [shape=plaintext]\n" > ${BUILDHISTORY_DIR_IMAGE}/depends.dot 335 printf "digraph depends {\n node [shape=plaintext]\n" > $1/depends.dot
342 cat ${BUILDHISTORY_DIR_IMAGE}/depends.tmp | sort | uniq >> ${BUILDHISTORY_DIR_IMAGE}/depends.dot 336 cat $1/depends.tmp | sort | uniq >> $1/depends.dot
343 echo "}" >> ${BUILDHISTORY_DIR_IMAGE}/depends.dot 337 echo "}" >> $1/depends.dot
344 rm ${BUILDHISTORY_DIR_IMAGE}/depends.tmp 338 rm $1/depends.tmp
345 339
346 # Produce installed package sizes list 340 # Produce installed package sizes list
347 printf "" > ${BUILDHISTORY_DIR_IMAGE}/installed-package-sizes.tmp 341 printf "" > $1/installed-package-sizes.tmp
348 cat $pkgcache | while read pkg pkgfile 342 cat $pkgcache | while read pkg pkgfile
349 do 343 do
350 if [ -f $pkgfile ] ; then 344 if [ -f $pkgfile ] ; then
351 pkgsize=`du -k $pkgfile | head -n1 | awk '{ print $1 }'` 345 pkgsize=`du -k $pkgfile | head -n1 | awk '{ print $1 }'`
352 echo $pkgsize $pkg >> ${BUILDHISTORY_DIR_IMAGE}/installed-package-sizes.tmp 346 echo $pkgsize $pkg >> $1/installed-package-sizes.tmp
353 fi 347 fi
354 done 348 done
355 cat ${BUILDHISTORY_DIR_IMAGE}/installed-package-sizes.tmp | sort -n -r | awk '{print $1 "\tKiB " $2}' > ${BUILDHISTORY_DIR_IMAGE}/installed-package-sizes.txt 349 cat $1/installed-package-sizes.tmp | sort -n -r | awk '{print $1 "\tKiB " $2}' > $1/installed-package-sizes.txt
356 rm ${BUILDHISTORY_DIR_IMAGE}/installed-package-sizes.tmp 350 rm $1/installed-package-sizes.tmp
357 351
358 # We're now done with the cache, delete it 352 # We're now done with the cache, delete it
359 rm $pkgcache 353 rm $pkgcache
360 354
361 # Produce some cut-down graphs (for readability) 355 if [ "$2" != "sdk" ] ; then
362 grep -v kernel_image ${BUILDHISTORY_DIR_IMAGE}/depends.dot | grep -v kernel_2 | grep -v kernel_3 > ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel.dot 356 # Produce some cut-down graphs (for readability)
363 grep -v libc6 ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel.dot | grep -v libgcc > ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel-nolibc.dot 357 grep -v kernel_image $1/depends.dot | grep -v kernel_2 | grep -v kernel_3 > $1/depends-nokernel.dot
364 grep -v update_ ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel-nolibc.dot > ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel-nolibc-noupdate.dot 358 grep -v libc6 $1/depends-nokernel.dot | grep -v libgcc > $1/depends-nokernel-nolibc.dot
365 grep -v kernel_module ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel-nolibc-noupdate.dot > ${BUILDHISTORY_DIR_IMAGE}/depends-nokernel-nolibc-noupdate-nomodules.dot 359 grep -v update_ $1/depends-nokernel-nolibc.dot > $1/depends-nokernel-nolibc-noupdate.dot
360 grep -v kernel_module $1/depends-nokernel-nolibc-noupdate.dot > $1/depends-nokernel-nolibc-noupdate-nomodules.dot
361 fi
366 362
367 # add complementary package information 363 # add complementary package information
368 if [ -e ${WORKDIR}/complementary_pkgs.txt ]; then 364 if [ -e ${WORKDIR}/complementary_pkgs.txt ]; then
369 cp ${WORKDIR}/complementary_pkgs.txt ${BUILDHISTORY_DIR_IMAGE} 365 cp ${WORKDIR}/complementary_pkgs.txt $1
370 fi 366 fi
371} 367}
372 368
373buildhistory_get_imageinfo() { 369buildhistory_get_image_installed() {
370 # Anything requiring the use of the packaging system should be done in here
371 # in case the packaging files are going to be removed for this image
372
374 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'image', '1', '0', d)}" = "0" ] ; then 373 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'image', '1', '0', d)}" = "0" ] ; then
375 return 374 return
376 fi 375 fi
377 376
378 # List the files in the image, but exclude date/time etc. 377 buildhistory_get_installed ${BUILDHISTORY_DIR_IMAGE}
378}
379
380buildhistory_get_sdk_installed() {
381 # Anything requiring the use of the packaging system should be done in here
382 # in case the packaging files are going to be removed for this SDK
383
384 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'sdk', '1', '0', d)}" = "0" ] ; then
385 return
386 fi
387
388 buildhistory_get_installed ${BUILDHISTORY_DIR_SDK}/$1 sdk
389}
390
391buildhistory_list_files() {
392 # List the files in the specified directory, but exclude date/time etc.
379 # This awk script is somewhat messy, but handles where the size is not printed for device files under pseudo 393 # This awk script is somewhat messy, but handles where the size is not printed for device files under pseudo
380 ( cd ${IMAGE_ROOTFS} && find . -ls | awk '{ if ( $7 ~ /[0-9]/ ) printf "%s %10-s %10-s %10s %s %s %s\n", $3, $5, $6, $7, $11, $12, $13 ; else printf "%s %10-s %10-s %10s %s %s %s\n", $3, $5, $6, 0, $10, $11, $12 }' | sort -k5 > ${BUILDHISTORY_DIR_IMAGE}/files-in-image.txt ) 394 ( cd $1 && find . -ls | awk '{ if ( $7 ~ /[0-9]/ ) printf "%s %10-s %10-s %10s %s %s %s\n", $3, $5, $6, $7, $11, $12, $13 ; else printf "%s %10-s %10-s %10s %s %s %s\n", $3, $5, $6, 0, $10, $11, $12 }' | sort -k5 > $2 )
395}
396
397
398buildhistory_get_imageinfo() {
399 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'image', '1', '0', d)}" = "0" ] ; then
400 return
401 fi
402
403 buildhistory_list_files ${IMAGE_ROOTFS} ${BUILDHISTORY_DIR_IMAGE}/files-in-image.txt
381 404
382 # Record some machine-readable meta-information about the image 405 # Record some machine-readable meta-information about the image
383 printf "" > ${BUILDHISTORY_DIR_IMAGE}/image-info.txt 406 printf "" > ${BUILDHISTORY_DIR_IMAGE}/image-info.txt
@@ -395,11 +418,32 @@ ${@buildhistory_get_layers(d)}
395END 418END
396} 419}
397 420
421buildhistory_get_sdkinfo() {
422 if [ "${@base_contains('BUILDHISTORY_FEATURES', 'sdk', '1', '0', d)}" = "0" ] ; then
423 return
424 fi
425
426 buildhistory_list_files ${SDK_OUTPUT} ${BUILDHISTORY_DIR_SDK}/files-in-sdk.txt
427
428 # Record some machine-readable meta-information about the SDK
429 printf "" > ${BUILDHISTORY_DIR_SDK}/sdk-info.txt
430 cat >> ${BUILDHISTORY_DIR_SDK}/sdk-info.txt <<END
431${@buildhistory_get_sdkvars(d)}
432END
433 sdksize=`du -ks ${SDK_OUTPUT} | awk '{ print $1 }'`
434 echo "SDKSIZE = $sdksize" >> ${BUILDHISTORY_DIR_SDK}/sdk-info.txt
435}
436
398# By prepending we get in before the removal of packaging files 437# By prepending we get in before the removal of packaging files
399ROOTFS_POSTPROCESS_COMMAND =+ "buildhistory_get_image_installed ; " 438ROOTFS_POSTPROCESS_COMMAND =+ "buildhistory_get_image_installed ; "
400 439
401IMAGE_POSTPROCESS_COMMAND += " buildhistory_get_imageinfo ; " 440IMAGE_POSTPROCESS_COMMAND += " buildhistory_get_imageinfo ; "
402 441
442POPULATE_SDK_POST_TARGET_COMMAND += "buildhistory_get_sdk_installed target ; "
443POPULATE_SDK_POST_HOST_COMMAND += "buildhistory_get_sdk_installed host ; "
444
445SDK_POSTPROCESS_COMMAND += "buildhistory_get_sdkinfo ; "
446
403def buildhistory_get_layers(d): 447def buildhistory_get_layers(d):
404 layertext = "Configured metadata layers:\n%s\n" % '\n'.join(get_layers_branch_rev(d)) 448 layertext = "Configured metadata layers:\n%s\n" % '\n'.join(get_layers_branch_rev(d))
405 return layertext 449 return layertext
@@ -418,15 +462,11 @@ def squashspaces(string):
418 import re 462 import re
419 return re.sub("\s+", " ", string).strip() 463 return re.sub("\s+", " ", string).strip()
420 464
421 465def outputvars(vars, listvars, d):
422def buildhistory_get_imagevars(d): 466 vars = vars.split()
423 imagevars = "DISTRO DISTRO_VERSION USER_CLASSES IMAGE_CLASSES IMAGE_FEATURES IMAGE_LINGUAS IMAGE_INSTALL BAD_RECOMMENDATIONS ROOTFS_POSTPROCESS_COMMAND IMAGE_POSTPROCESS_COMMAND"
424 listvars = "USER_CLASSES IMAGE_CLASSES IMAGE_FEATURES IMAGE_LINGUAS IMAGE_INSTALL BAD_RECOMMENDATIONS"
425
426 imagevars = imagevars.split()
427 listvars = listvars.split() 467 listvars = listvars.split()
428 ret = "" 468 ret = ""
429 for var in imagevars: 469 for var in vars:
430 value = d.getVar(var, True) or "" 470 value = d.getVar(var, True) or ""
431 if var in listvars: 471 if var in listvars:
432 # Squash out spaces 472 # Squash out spaces
@@ -434,6 +474,16 @@ def buildhistory_get_imagevars(d):
434 ret += "%s = %s\n" % (var, value) 474 ret += "%s = %s\n" % (var, value)
435 return ret.rstrip('\n') 475 return ret.rstrip('\n')
436 476
477def buildhistory_get_imagevars(d):
478 imagevars = "DISTRO DISTRO_VERSION USER_CLASSES IMAGE_CLASSES IMAGE_FEATURES IMAGE_LINGUAS IMAGE_INSTALL BAD_RECOMMENDATIONS ROOTFS_POSTPROCESS_COMMAND IMAGE_POSTPROCESS_COMMAND"
479 listvars = "USER_CLASSES IMAGE_CLASSES IMAGE_FEATURES IMAGE_LINGUAS IMAGE_INSTALL BAD_RECOMMENDATIONS"
480 return outputvars(imagevars, listvars, d)
481
482def buildhistory_get_sdkvars(d):
483 sdkvars = "DISTRO DISTRO_VERSION SDK_NAME SDK_VERSION SDKMACHINE SDKIMAGE_FEATURES BAD_RECOMMENDATIONS"
484 listvars = "SDKIMAGE_FEATURES BAD_RECOMMENDATIONS"
485 return outputvars(sdkvars, listvars, d)
486
437 487
438buildhistory_commit() { 488buildhistory_commit() {
439 if [ ! -d ${BUILDHISTORY_DIR} ] ; then 489 if [ ! -d ${BUILDHISTORY_DIR} ] ; then