]> code.ossystems Code Review - openembedded-core.git/commitdiff
classes/image: write image manifest
authorPaul Eggleton <paul.eggleton@linux.intel.com>
Tue, 26 Nov 2013 12:09:52 +0000 (12:09 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Tue, 26 Nov 2013 23:00:27 +0000 (23:00 +0000)
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:

<packagename> <packagearch> <version>

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 <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/image.bbclass
meta/classes/populate_sdk_deb.bbclass
meta/classes/populate_sdk_ipk.bbclass
meta/classes/populate_sdk_rpm.bbclass
meta/classes/rootfs_ipk.bbclass
scripts/opkg-query-helper.py

index bc60f0d6c05baf5ac3ce3dca0ba27da6f8e2dd15..8217fb32542d9d228f050b65619ee8a3d30377ae 100644 (file)
@@ -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.
index ebb842ba86f9116b079e9b6299cded373c1f5cdb..a63280d1ef1ae2ab60c7d325f210e82388585093 100644 (file)
@@ -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
index 04c71af42e2994fe2cb10fd6b3009f2a933dfe0c..fc6ed536a81181faa0cdb0c88575e1e5239ada32 100644 (file)
@@ -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
index b0105931a1e2598265b1e102d109d333f45d4012..67cccafe4c873c3a28c4d3e9c3359c686257b3f1 100644 (file)
@@ -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
index 6ce3e5d908a6e377f1e7e7615d3e5cef29e041b8..dbe1c798a664b037e6d35a657733c62867f7472b 100644 (file)
@@ -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
index fa6c44fa8b16785da50922a8b47eb6c7b22fab51..2fb1a78970962d768326a316aada96b44365958e 100755 (executable)
@@ -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]