[OE-core] [morty][PATCH] libtool-cross: remove host specific paths to native sysroot from sstate archive

Martin Jansa martin.jansa at gmail.com
Fri Apr 12 16:58:34 UTC 2019


* when you build libtool-cross on one builder in some directory
  and then reuse the same libtool-cross on another builder in
  different directory, you'll have some variables still pointing
  to wrong directory (it's a bit worse when it's on the same
  builder, just in different workspace, because then the directory
  might exist and not exist depending on the state of the other
  workspace and then the failures are even more random)

* in my case I'm building libtool-cross in /jenkins/mjansa/build-nodistro-morty/
  and you can see the paths to native sysroot in:
  LTCFLAGS, sys_lib_search_path_spec, compiler_lib_search_dirs, compiler_lib_search_path
  after this change, there is only one case in LTCFLAGS -fdebug-prefix-map
  which points to the old WORKDIR:

  # grep build-nodistro-morty sstate-*/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool
  sstate-bad/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:LTCFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/jenkins/mjansa/build-nodistro-morty/BUILD/work/i586-oe-linux/libtool-cross/2.4.6-r0=/usr/src/debug/libtool-cross/2.4.6-r0 -fdebug-prefix-map=/jenkins/mjansa/build-nodistro-morty/BUILD/sysroots/x86_64-linux= -fdebug-prefix-map=FIXMESTAGINGDIRHOST= "
  sstate-bad/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:sys_lib_search_path_spec="/jenkins/mjansa/build-nodistro-morty/BUILD/sysroots/x86_64-linux/usr/lib/i586-oe-linux/gcc/i586-oe-linux/6.4.0 FIXMESTAGINGDIRHOST/lib FIXMESTAGINGDIRHOST/usr/lib/i586-oe-linux/6.4.0 FIXMESTAGINGDIRHOST/usr/lib "
  sstate-bad/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:compiler_lib_search_dirs="/jenkins/mjansa/build-nodistro-morty/BUILD/sysroots/x86_64-linux/usr/lib/i586-oe-linux/gcc/i586-oe-linux/6.4.0 FIXMESTAGINGDIRHOST/lib FIXMESTAGINGDIRHOST/usr/lib/i586-oe-linux/6.4.0 FIXMESTAGINGDIRHOST/usr/lib"
  sstate-bad/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:compiler_lib_search_path="-L/jenkins/mjansa/build-nodistro-morty/BUILD/sysroots/x86_64-linux/usr/lib/i586-oe-linux/gcc/i586-oe-linux/6.4.0 -LFIXMESTAGINGDIRHOST/lib -LFIXMESTAGINGDIRHOST/usr/lib/i586-oe-linux/6.4.0 -LFIXMESTAGINGDIRHOST/usr/lib"

  sstate-better/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:LTCFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/jenkins/mjansa/build-nodistro-morty/BUILD/work/i586-oe-linux/libtool-cross/2.4.6-r0=/usr/src/debug/libtool-cross/2.4.6-r0 -fdebug-prefix-map=FIXME_STAGING_DIR_NATIVE= -fdebug-prefix-map=FIXMESTAGINGDIRHOST= "

* It seems there aren't many cases where the above variables cause big issues,
  but it gets worse when you build "dd" in native sysroot (coreutils-native),
  before libtool-cross (this is why this is bad only with Yocto 2.2 Morty and
  older before RSS, with Pyro and newer you won't detect bin/dd in
  native sysroot without explicit dependency on coreutils-native and you'll
  always use dd from HOSTTOOLS)

  without coreutils-native in sysroot:
  sstate-better/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:lt_truncate_bin="/bin/dd bs=4096 count=1"

  with coreutils-native in sysroot before and after this change:
  sstate-bad-with-dd/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:lt_truncate_bin="/jenkins/mjansa/build-nodistro-morty/BUILD/sysroots/x86_64-linux/usr/bin/dd bs=4096 count=1"
  sstate-better-with-dd/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:lt_truncate_bin="FIXME_STAGING_DIR_NATIVE/usr/bin/dd bs=4096 count=1"

  this issue was already resolved for target libtool, but not for
  libtool-cross in:
  http://git.openembedded.org/openembedded-core/commit/meta/recipes-devtools/libtool?h=morty&id=5e83a72f1ec834063d27b924bc7f9a047204cec6

  and the HOSTTOOLS_DIR and DEBUG_PREFIX_MAP a bit later in rocko (but
  again only for target libtool, not libtool-cross:
  http://git.openembedded.org/openembedded-core/commit/meta/recipes-devtools/libtool?h=rocko&id=04db02138e363898e040e33557f1296e8a43c3fd

  the above still isn't ideal, because now FIXME_STAGING_DIR_NATIVE/usr/bin/dd will be
  replaced with correct path to native sysroot when unpacking libtool-cross from sstate
  but it will still need coreutils-native dependency to find /usr/bin/dd there.
  Add ac_cv_path_lt_DD=dd to CACHED_CONFIGUREVARS to prevent using absolute path to
  dd (like we already do for grep) to prevent this issue as well, now we have:

  sstate-best-with-dd/sysroot-destdir/usr/bin/crossscripts/i586-oe-linux-libtool:lt_truncate_bin="dd bs=4096 count=1"

* I've noticed this in a build which was failing with:
  ERROR: lib32-db-5.3.28-r1 do_package_qa: QA Issue: /usr/bin/db_verify contained in package lib32-db-bin requires /bin/bash, but no providers found in RDEPENDS_lib32-db-bin? [file-rdeps]
  and strengly enough, this was cased by all /usr/bin/db_* files being the libtool
  linker scripts instead of the actual binaries, in the log.do_install you can notice
  only small warning and different path when installing the utilities:
  working case:
  x86_64-oe-linux-libtool: warning: 'libdb-5.3.la' has not been installed in '/usr/lib64'
  x86_64-oe-linux-libtool: install: cp -p .libs/db_checkpoint /jenkins/mjansa/build-nodistro-morty/BUILD/work/qemux86-oe-linux/db/5.3.28-r1/image/usr/bin/db_checkpoint
  broken case:
  x86_64-oe-linux-libtool: install: cp -p db_checkpoint /jenkins/mjansa/build-nodistro-morty/BUILD/work/qemux86-oe-linux/db/5.3.28-r1/image/usr/bin/db_checkpoint

  this was caused by the invalid path to "dd" mentioned above, comparing
  libtool --mode-install --debug shows:

  diff -uNr log.install.db_archive.libtool.{ape,raven}
  --- log.install.db_archive.libtool.ape  2019-04-12 13:36:07.127370425 +0000
  +++ log.install.db_archive.libtool.raven        2019-04-12 13:36:25.847821004 +0000
  @@ -202,9 +202,125 @@
   + wrapper=db_archive
   + func_ltwrapper_script_p db_archive
   + test -f db_archive
  ++ /bin/dd bs=4096 count=1
   + func_generated_by_libtool_p
  -+ /home/jenkins/anaconda/build-nodistro-morty/build/BUILD/sysroots/x86_64-linux/usr/bin/dd bs=4096 count=1
   + grep '^# Generated by .*libtool'
  ++ notinst_deplibs=
  ...
  func_ltwrapper_script_p, calls lt_truncate_bin and pipes the result to
  func_generated_by_libtool_p, but with non-existent path to dd this fails
  and libtool installs the db_archive script, instead of sourcing it and installing
  the actual binary .libs/db_checkpoint

Signed-off-by: Martin Jansa <Martin.Jansa at gmail.com>
---
 meta/recipes-devtools/libtool/libtool-cross_2.4.6.bb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/meta/recipes-devtools/libtool/libtool-cross_2.4.6.bb b/meta/recipes-devtools/libtool/libtool-cross_2.4.6.bb
index b268310468..40530b3cfa 100644
--- a/meta/recipes-devtools/libtool/libtool-cross_2.4.6.bb
+++ b/meta/recipes-devtools/libtool/libtool-cross_2.4.6.bb
@@ -38,3 +38,7 @@ do_install () {
 SYSROOT_DIRS += "${bindir_crossscripts} ${target_datadir}"
 
 SSTATE_SCAN_FILES += "libtoolize *-libtool"
+
+# Replace native sysroot as well, it's used in
+# LTCFLAGS, sys_lib_search_path_spec, compiler_lib_search_dirs, compiler_lib_search_path variables
+EXTRA_STAGING_FIXMES = "STAGING_DIR_NATIVE"
-- 
2.17.1



More information about the Openembedded-core mailing list