[OE-core] [PATCH] qemuwrapper-cross: fix postinst failed warning

changqing.li at windriver.com changqing.li at windriver.com
Wed May 30 04:27:13 UTC 2018


From: Changqing Li <changqing.li at windriver.com>

1. some binary like udev-hwdb/pixbufcache/gio-module-cache/fontcache
uses qemu usermode by default,  but some architecture such as Intel
skylake does not support qemu usermode, this can lead to a build warning as below:
warning: %post(udev-hwdb-1:234-r0.skylake_64) scriptlet failed, exit status
"WARNING: The postinstall intercept hook 'update_pixbufcache' failed".
"WARNING: The postinstall intercept hook 'update_gio_module_cache' failed".
"WARNING: The postinstall intercept hook 'update_font_cache' failed".

Add judgement of qemu usermode in qemuwrapper-cross, when qemu usermode is
not supported, qemuwrapper exit 1 directly.

2. font is not arch related, but receipe like liberation-fonts inherit fontcache,
fontcache called update_font_cache, update_font_cache use qemuwrapper,
qemuwrapper is arch related, so update_font_cache will core dumped as below:

WARNING: The postinstall intercept hook 'update_font_cache' failed,
NOTE: Exit code 132. Output:
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
qemuwrapper: line 5: 267705 Illegal instruction     (core dumped) qemu-x86_64 -r 3.2.0 -cpu core2duo "$@"

in update_font_cache, it runs:
qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir} -E ${fontconfigcacheenv} $D${bindir}/fc-cache --sysroot=$D --system-only

qemuwrapper sets LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir} for fc-cache,
since fontcache inherit allarch, ${base_libdir} is "/lib", ${libdir} is "/usr/lib",
but in this case, fc-cache need /lib64 and /usr/lib64 to run,
So fc-cache doesn't work, and caused the warning.

so set the default arch related library path in qemuwrapper, not set in the update_font_cache,
if binary have extra library path,  it can still pass "-E LD_LIBRARY_PATH=", qemuwrapper will
append the default library path after it.

Signed-off-by: Changqing Li <changqing.li at windriver.com>
---
 meta/classes/gobject-introspection.bbclass         |  2 +-
 meta/classes/qemu.bbclass                          |  6 +--
 .../qemu/files/qemuwrapperhelper.py                | 27 ++++++++++++
 .../recipes-devtools/qemu/qemuwrapper-cross_1.0.bb | 49 ++++++++++++++--------
 scripts/postinst-intercepts/update_font_cache      |  3 +-
 .../postinst-intercepts/update_gio_module_cache    |  3 +-
 scripts/postinst-intercepts/update_pixbuf_cache    |  3 +-
 7 files changed, 63 insertions(+), 30 deletions(-)
 create mode 100644 meta/recipes-devtools/qemu/files/qemuwrapperhelper.py

diff --git a/meta/classes/gobject-introspection.bbclass b/meta/classes/gobject-introspection.bbclass
index b6160b8..e4b510e 100644
--- a/meta/classes/gobject-introspection.bbclass
+++ b/meta/classes/gobject-introspection.bbclass
@@ -17,7 +17,7 @@ UNKNOWN_CONFIGURE_WHITELIST_append = " --enable-introspection --disable-introspe
 
 # Generating introspection data depends on a combination of native and target
 # introspection tools, and qemu to run the target tools.
-DEPENDS_append_class-target = " gobject-introspection gobject-introspection-native qemu-native prelink-native"
+DEPENDS_append_class-target = " gobject-introspection gobject-introspection-native qemu-native prelink-native qemuwrapper-cross"
 
 # Even though introspection is disabled on -native, gobject-introspection package is still
 # needed for m4 macros.
diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
index f5c5780..372d087 100644
--- a/meta/classes/qemu.bbclass
+++ b/meta/classes/qemu.bbclass
@@ -22,13 +22,9 @@ def qemu_target_binary(data):
 def qemu_wrapper_cmdline(data, rootfs_path, library_paths):
     import string
 
-    qemu_binary = qemu_target_binary(data)
-    if qemu_binary == "qemu-allarch":
-        qemu_binary = "qemuwrapper"
-
     qemu_options = data.getVar("QEMU_OPTIONS")    
 
-    return "PSEUDO_UNLOAD=1 " + qemu_binary + " " + qemu_options + " -L " + rootfs_path\
+    return "PSEUDO_UNLOAD=1 " + "qemuwrapper" + " " + qemu_options + " -L " + rootfs_path\
             + " -E LD_LIBRARY_PATH=" + ":".join(library_paths) + " "
 
 # Next function will return a string containing the command that is needed to
diff --git a/meta/recipes-devtools/qemu/files/qemuwrapperhelper.py b/meta/recipes-devtools/qemu/files/qemuwrapperhelper.py
new file mode 100644
index 0000000..967f5fd
--- /dev/null
+++ b/meta/recipes-devtools/qemu/files/qemuwrapperhelper.py
@@ -0,0 +1,27 @@
+import sys
+
+def qemu_get_parameters():
+    flag = 0
+    parameters=""
+
+    for i in sys.argv[1:-1]:
+        if "LD_LIBRARY_PATH=" in i:
+            flag = 1
+
+    if flag == 0:
+        for index, i in enumerate(sys.argv[1:-1]):
+            if sys.argv[index-1] == '-L':
+                parameters = parameters + "-E LD_LIBRARY_PATH=" + sys.argv[-1] + " " + i + " "
+            else:
+                parameters = parameters + i + " "
+    else:
+        for i in sys.argv[1:-1]:
+            if "LD_LIBRARY_PATH=" in i:
+                parameters = parameters + i + ":" + sys.argv[-1] + " "
+            else:
+                parameters = parameters + i + " "
+
+    print parameters
+
+if __name__ == '__main__':
+    qemu_get_parameters()
diff --git a/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb b/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb
index c983fba..3574286 100644
--- a/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb
+++ b/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb
@@ -1,6 +1,9 @@
 SUMMARY = "QEMU wrapper script"
 HOMEPAGE = "http://qemu.org"
 LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://qemuwrapperhelper.py" 
 
 S = "${WORKDIR}"
 
@@ -12,37 +15,47 @@ do_populate_sysroot[depends] = ""
 
 do_install () {
 	install -d ${D}${bindir_crossscripts}/
+	install qemuwrapperhelper.py ${D}${bindir_crossscripts}/
 
 	echo "#!/bin/sh" > ${D}${bindir_crossscripts}/qemuwrapper
-	qemu_binary=${@qemu_target_binary(d)}
-	qemu_options='${QEMU_OPTIONS}'
-	echo "$qemu_binary $qemu_options \"\$@\"" >> ${D}${bindir_crossscripts}/qemuwrapper
-	fallback_qemu_bin=
-	case $qemu_binary in
-		"qemu-i386")
-			fallback_qemu_bin=qemu-x86_64
-			;;
-		"qemu-x86_64")
-			fallback_qemu_bin=qemu-i386
-			;;
-		*)
-			;;
-	esac
-
-	if [ -n "$fallback_qemu_bin" ]; then
+
+        if ${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'true','false', d)}; then
+		qemu_binary=${@qemu_target_binary(d)}
+		qemu_options='${QEMU_OPTIONS}'
+		default_library_option='$D/${libdir}:$D/${base_libdir}'
+
+		echo "default_library_option=$default_library_option" >> ${D}${bindir_crossscripts}/qemuwrapper
+		echo "qemu_parameters=\`python ${D}${bindir_crossscripts}/qemuwrapperhelper.py \"\$@\" \$default_library_option \`" >> ${D}${bindir_crossscripts}/qemuwrapper
+		echo "$qemu_binary $qemu_options \$qemu_parameters" >> ${D}${bindir_crossscripts}/qemuwrapper
+		fallback_qemu_bin=
+		case $qemu_binary in
+			"qemu-i386")
+				fallback_qemu_bin=qemu-x86_64
+				;;
+			"qemu-x86_64")
+				fallback_qemu_bin=qemu-i386
+				;;
+			*)
+				;;
+		esac
+
+		if [ -n "$fallback_qemu_bin" ]; then
 
 		cat >> ${D}${bindir_crossscripts}/qemuwrapper << EOF
 rc=\$?
 if [ \$rc = 255 ]; then
-	$fallback_qemu_bin "\$@"
+	$fallback_qemu_bin \$qemu_parameters
 	rc=\$?
 fi
 exit \$rc
 EOF
-
+		fi
+	else
+		echo "exit 1" >>  ${D}${bindir_crossscripts}/qemuwrapper
 	fi
 
 	chmod +x ${D}${bindir_crossscripts}/qemuwrapper
+	chmod +x ${D}${bindir_crossscripts}/qemuwrapperhelper.py
 }
 
 SYSROOT_DIRS += "${bindir_crossscripts}"
diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
index bf65e19..e797c65 100644
--- a/scripts/postinst-intercepts/update_font_cache
+++ b/scripts/postinst-intercepts/update_font_cache
@@ -2,6 +2,5 @@
 
 set -e
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir} \
-					-E ${fontconfigcacheenv} $D${bindir}/fc-cache --sysroot=$D --system-only ${fontconfigcacheparams}
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E ${fontconfigcacheenv} $D${bindir}/fc-cache --sysroot=$D --system-only ${fontconfigcacheparams}
 chown -R root:root $D${fontconfigcachedir}
diff --git a/scripts/postinst-intercepts/update_gio_module_cache b/scripts/postinst-intercepts/update_gio_module_cache
index fc3f9d0..7ad9c5a 100644
--- a/scripts/postinst-intercepts/update_gio_module_cache
+++ b/scripts/postinst-intercepts/update_gio_module_cache
@@ -2,8 +2,7 @@
 
 set -e
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D${libdir}:$D${base_libdir} \
-	$D${libexecdir}/${binprefix}gio-querymodules $D${libdir}/gio/modules/
+PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${libexecdir}/${binprefix}gio-querymodules $D${libdir}/gio/modules/
 
 [ ! -e $D${libdir}/gio/modules/giomodule.cache ] ||
 	chown root:root $D${libdir}/gio/modules/giomodule.cache
diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
index 5d44075..efb56fa 100644
--- a/scripts/postinst-intercepts/update_pixbuf_cache
+++ b/scripts/postinst-intercepts/update_pixbuf_cache
@@ -5,7 +5,6 @@ set -e
 export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
 export GDK_PIXBUF_FATAL_LOADER=1
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir}\
-    $D${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders \
+PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders \
     >$GDK_PIXBUF_MODULEDIR/../loaders.cache && \
     sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
-- 
2.7.4




More information about the Openembedded-core mailing list