From: Paul Eggleton Date: Tue, 26 Nov 2013 12:09:52 +0000 (+0000) Subject: classes/image: write image manifest X-Git-Tag: lucaceresoli/bug-15201-perf-libtraceevent-missing~35332 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2978d1f2617a33e2e3a77e249d73e998d79b4ec9;p=thirdparty%2Fopenembedded%2Fopenembedded-core-contrib.git classes/image: write image manifest Write a list of installed packages to a .manifest file next to the image, so we can find out what went into the image after it has been constructed without necessarily having to have buildhistory enabled (although that will provide more detail.) We can make use of this for example in the testimage class associated code that checks for installed packages for determining whether or not to run specific tests. Note: this replaces the previous ipk-specific manifest code with something that works for ipk, rpm and deb, and instead of a pruned status file, packages are listed one per line, in the following format: Tests for all three backends have shown that the performance impact of this change is negligible (about 1.5s max). Implements [YOCTO #5410] Signed-off-by: Paul Eggleton Signed-off-by: Richard Purdie --- diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index bc60f0d6c05..8217fb32542 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass @@ -179,6 +179,9 @@ ROOTFS_POSTPROCESS_COMMAND_prepend = "run_intercept_scriptlets; " ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks", "ssh_allow_empty_password; ", "",d)}' # Enable postinst logging if debug-tweaks is enabled ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks", "postinst_enable_logging; ", "",d)}' +# Write manifest +IMAGE_MANIFEST = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.manifest" +ROOTFS_POSTPROCESS_COMMAND =+ "write_image_manifest ; " # Set default postinst log file POSTINST_LOGFILE ?= "${localstatedir}/log/postinstall.log" @@ -381,6 +384,11 @@ fakeroot do_rootfs () { ${IMAGE_POSTPROCESS_COMMAND} ${MACHINE_POSTPROCESS_COMMAND} + + if [ -n "${IMAGE_LINK_NAME}" -a -f "${IMAGE_MANIFEST}" ]; then + rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest + ln -s ${IMAGE_NAME}.rootfs.manifest ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest + fi } insert_feed_uris () { @@ -602,12 +610,7 @@ make_zimage_symlink_relative () { } write_image_manifest () { - rootfs_${IMAGE_PKGTYPE}_write_manifest - - if [ -n "${IMAGE_LINK_NAME}" ]; then - rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest - ln -s ${IMAGE_NAME}.rootfs.manifest ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest - fi + list_installed_packages ver | sort > ${IMAGE_MANIFEST} } # Make login manager(s) enable automatic login. diff --git a/meta/classes/populate_sdk_deb.bbclass b/meta/classes/populate_sdk_deb.bbclass index ebb842ba86f..a63280d1ef1 100644 --- a/meta/classes/populate_sdk_deb.bbclass +++ b/meta/classes/populate_sdk_deb.bbclass @@ -84,6 +84,8 @@ list_installed_packages() { echo "$pkg $fullpath $pkgarch" fi done + elif [ "$1" = "ver" ] ; then + ${DPKG_QUERY_COMMAND} -W -f='${Package} ${PackageArch} ${Version}\n' else ${DPKG_QUERY_COMMAND} -W -f='${Package}\n' fi diff --git a/meta/classes/populate_sdk_ipk.bbclass b/meta/classes/populate_sdk_ipk.bbclass index 04c71af42e2..fc6ed536a81 100644 --- a/meta/classes/populate_sdk_ipk.bbclass +++ b/meta/classes/populate_sdk_ipk.bbclass @@ -70,6 +70,8 @@ list_installed_packages() { echo "$pkg $fullpath $pkgarch" fi done + elif [ "$1" = "ver" ] ; then + opkg-cl ${OPKG_ARGS} status | opkg-query-helper.py -v else opkg-cl ${OPKG_ARGS} list_installed | awk '{ print $1 }' fi diff --git a/meta/classes/populate_sdk_rpm.bbclass b/meta/classes/populate_sdk_rpm.bbclass index b0105931a1e..67cccafe4c8 100644 --- a/meta/classes/populate_sdk_rpm.bbclass +++ b/meta/classes/populate_sdk_rpm.bbclass @@ -162,6 +162,8 @@ list_installed_packages() { ${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH}\n]" | translate_smart_to_oe arch elif [ "$1" = "file" ]; then ${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH} %{PACKAGEORIGIN}\n]" | translate_smart_to_oe file + elif [ "$1" = "ver" ]; then + ${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH} %{VERSION}\n]" | translate_smart_to_oe arch else ${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH}\n]" | translate_smart_to_oe fi diff --git a/meta/classes/rootfs_ipk.bbclass b/meta/classes/rootfs_ipk.bbclass index 6ce3e5d908a..dbe1c798a66 100644 --- a/meta/classes/rootfs_ipk.bbclass +++ b/meta/classes/rootfs_ipk.bbclass @@ -118,20 +118,6 @@ save_postinsts () { done } -rootfs_ipk_write_manifest() { - manifest=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.manifest - cp ${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/status $manifest - - sed '/Depends/d' -i $manifest - sed '/Status/d' -i $manifest - sed '/Architecture/d' -i $manifest - sed '/Installed-Time/d' -i $manifest - sed '/Auto-Installed/d' -i $manifest - sed '/Recommends/d' -i $manifest - sed '/Provides/d' -i $manifest - sed '/Conflicts/d' -i $manifest -} - remove_packaging_data_files() { rm -rf ${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg # We need the directory for the package manager lock diff --git a/scripts/opkg-query-helper.py b/scripts/opkg-query-helper.py index fa6c44fa8b1..2fb1a789709 100755 --- a/scripts/opkg-query-helper.py +++ b/scripts/opkg-query-helper.py @@ -28,6 +28,7 @@ import re archmode = False filemode = False +vermode = False args = [] for arg in sys.argv[1:]: @@ -35,6 +36,8 @@ for arg in sys.argv[1:]: archmode = True elif arg == '-f': filemode = True + elif arg == '-v': + vermode = True else: args.append(arg) @@ -60,6 +63,12 @@ for line in fileinput.input(args): elif line.startswith("Architecture:"): arch = line.split(": ")[1] print("%s %s_%s_%s.ipk %s" % (pkg,pkg,ver,arch,arch)) + elif vermode: + if line.startswith("Version:"): + ver = line.split(": ")[1] + elif line.startswith("Architecture:"): + arch = line.split(": ")[1] + print("%s %s %s" % (pkg,arch,ver)) else: if line.startswith("Depends:"): depval = line.split(": ")[1]