Bug 8784 - IMAGE_LINGUAS did not support multilib correctly
Summary: IMAGE_LINGUAS did not support multilib correctly
Status: RESOLVED WONTFIX
Alias: None
Product: OE-Core
Classification: Build System, Metadata & Runtime
Component: core (show other bugs)
Version: 2.2
Hardware: x86 Multiple
: Medium normal
Target Milestone: 2.2 M3
Assignee: Hongxu Jia
QA Contact:
URL:
Whiteboard:
Depends on:
Blocks:
 
Reported: 2015-12-10 10:07 UTC by Hongxu Jia
Modified: 2016-07-29 02:20 UTC (History)
4 users (show)

See Also:
OS type for building Yocto: ---
Type of Regression: ---
Verified:
Documentation change: No (bug/feature does not impact docs)


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Hongxu Jia 2015-12-10 10:07:11 UTC
IMAGE_LINGUAS did not support multilib correctly

1. Make use of service in meta-skeleton to test the issue.
   The app invoke setlocale(LC_CTYPE, "en_US.UTF-8") in C.

--- a/meta-skeleton/recipes-skeleton/service/service/skeleton_test.c
+++ b/meta-skeleton/recipes-skeleton/service/service/skeleton_test.c
@@ -1,12 +1,13 @@
-#include <unistd.h>
-
-/* This demo does nothing except for testing /etc/init.d/skeleton */
+#include <locale.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
 
 int main(int argc, char *argv[])
 {
-       daemon(0, 0);
-       while (1) {
-               sleep(1);
-       }
-       return 0;
+    char *p = setlocale (LC_CTYPE, "en_US.UTF-8");
+    if (p == NULL)
+        printf("setlocale failed: %s\n", strerror(errno));
+    else
+        printf("p %s\n", p);
 }

--- a/meta-skeleton/recipes-skeleton/service/service_0.1.bb
+++ b/meta-skeleton/recipes-skeleton/service/service_0.1.bb
@@ -1,4 +1,4 @@
-SUMMARY = "The canonical example of init scripts"
+SUMMARY = "The example to test multilib of setlocale"
 SECTION = "base"
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://${WORKDIR}/COPYRIGHT;md5=349c872e0066155e1818b786938876a4"
@@ -8,24 +8,14 @@ SRC_URI = "file://skeleton \
           file://COPYRIGHT \
           "
 
+FILES_${PN} += "${libdir}/setlocale"
+
 do_compile () {
-       ${CC} ${WORKDIR}/skeleton_test.c -o ${WORKDIR}/skeleton-test
+       ${CC} ${WORKDIR}/skeleton_test.c -o ${WORKDIR}/setlocale
 }
 
 do_install () {
-       install -d ${D}${sysconfdir}/init.d
-       cat ${WORKDIR}/skeleton | \
-         sed -e 's,/etc,${sysconfdir},g' \
-             -e 's,/usr/sbin,${sbindir},g' \
-             -e 's,/var,${localstatedir},g' \
-             -e 's,/usr/bin,${bindir},g' \
-             -e 's,/usr,${prefix},g' > ${D}${sysconfdir}/init.d/skeleton
-       chmod a+x ${D}${sysconfdir}/init.d/skeleton
-
-       install -d ${D}${sbindir}
-       install -m 0755 ${WORKDIR}/skeleton-test ${D}${sbindir}/
+       install -d ${D}${libdir}
+       install -m 0755 ${WORKDIR}/setlocale ${D}${libdir}/
 }
 
-RDEPENDS_${PN} = "initscripts"
-
-CONFFILES_${PN} += "${sysconfdir}/init.d/skeleton"


2. On qemux86-64, enable multilib, add non-multilib and
   multilib service to image, assign 'en-us' to IMAGE_LINGUAS
vim local.conf
...
MACHINE ?= "qemux86-64"

require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "core2-32"

IMAGE_INSTALL_append = " file service lib32-service"
IMAGE_LINGUAS_append = " en-us"
...

vim bblayers.conf
...
BBLAYERS ?= " \ 
  /buildarea/raid0/hjia/poky/meta \
  /buildarea/raid0/hjia/poky/meta-yocto \
  /buildarea/raid0/hjia/poky/meta-skeleton \
  "
...

2. Build non-multilib image
$ bitbake core-image-minimal

3. Run qemu
$ runqemu qemux86-64 core-image-minimal slirp nographic

4. In qemu, invoke multilib /usr/lib/setlocale failed and
   invoke non-multilib /usr/lib64/setlocale success

root@qemux86-64:~# file /usr/lib/setlocale 
/usr/lib/setlocale: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0caa404112fe8963dd1418757fc4bdee0cab272d, stripped
root@qemux86-64:~# /usr/lib/setlocale 
setlocale failed: No such file or directory

root@qemux86-64:~# file /usr/lib64/setlocale  
/usr/lib64/setlocale: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b8c88222213ffbd4603b34337b3db71aba43c968, stripped
root@qemux86-64:~# 
root@qemux86-64:~# /usr/lib64/setlocale
p en_US.UTF-8

5. The locale-base-en-us installed, but lib32-locale-base-en-us not installed.
root@qemux86-64:~# ls /usr/lib64/locale/en_US/
LC_ADDRESS         LC_CTYPE           LC_MEASUREMENT     LC_MONETARY        LC_NUMERIC         LC_TELEPHONE
LC_COLLATE         LC_IDENTIFICATION  LC_MESSAGES

root@qemux86-64:~# ls /usr/lib/locale/en_US/
ls: /usr/lib/locale/en_US/: No such file or directory
Comment 1 Hongxu Jia 2016-07-29 02:20:17 UTC
Rarely use IMAGE_LINGUAS for multilib, and the fix introduced more issue
than fixed.