Search code examples
yoctoglibcyocto-recipe

Yocto Dunfell - glibc do_stash_locale failed in multilib enabled environment


Yocto build failed in glibc. Build failed in do_stash_locale with below error.

ERROR: lib64-glibc-2.31+gitAUTOINC+1094741224-r0 do_stash_locale: The recipe lib64-glibc is trying to install files into a shared area when those files already exist. Those files and their manifest location are:
 /mnt/********/workspace/********/build-********/tmp/sysroots-components/aarch64/glibc-stash-locale/SUPPORTED
(matched in manifest-aarch64-glibc.stash_locale)
 /mnt/********/workspace/********/build-********/tmp/sysroots-components/aarch64/glibc-stash-locale/scripts/sotruss
(matched in manifest-aarch64-glibc.stash_locale)
/mnt/********/workspace/********/build-********/tmp/sysroots-components/aarch64/glibc-stash-locale/scripts/xtrace
(matched in manifest-aarch64-glibc.stash_locale)
/mnt/********/workspace/********/build-********/tmp/sysroots-components/aarch64/glibc-stash-locale/scripts/mtrace
(matched in manifest-aarch64-glibc.stash_locale)
/mnt/********/workspace/********/build-********/tmp/sysroots-components/aarch64/glibc-stash-locale/usr/share/info/libc.info
(matched in manifest-aarch64-glibc.stash_locale)
.....

Here in the build, we have enabled multilib because of:

  1. 64bit Machine (aarch64), Kernel needs to build using 64bit toolchain.
  2. 32bit userspace application, so mulitlib enabled.
  3. Also we have to run a couple of 64bit applications as well, so multilib:lib64 is also used.

So here our configuration is:

  require conf/machine/include/tune-cortexa53.inc
  require conf/multilib.conf
  MULTILIBS = "multilib:lib32 multilib:lib64"
  DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"
  IMAGE_INSTALL_append = " lib32-glib-2.0 lib32-bash"
  DEFAULTTUNE = "cortexa53"
  DEFAULTTUNE_virtclass-multilib-lib64 = "armv8a"

Here we are building final target as lib32-xxxxx-image and 64 bit application included in the image recipe as IMAGE_INSTALL_append += " lib64-xxxxx".

When we do fresh build without any sstate cache, the build failed in glibc do_stash_locale. It would be very helpful if some pointers gets on this?


Solution

  • I found a solution by adding the required recipes into NON_MULTILIB_RECIPES so for those packages , mlprefix will removed and use default toolchain to build it.

    So here:

    1. Define multilib:lib32 for building userspace applications using 32bit toolchain.
    2. For apps required 64bit toolchain, add those recipes into NON_MULTILIB_RECIPES += " xxxx yyyy "

    So here no need to add both 32 and 64bit multilibs here as default tune is 64bit.