Yocto 本机构建 64 位系统上 32 位的一些食谱

Yocto native build of some recipes for 32 bit on 64bit system

我正在尝试在 yocto 中将一些本机包构建为 32 位(实际上是 2.6.1,在 64 位 linux 上)。我的目标根本不使用 multilib。假设我正在构建配方 a,它需要(所有构建时,静态链接)包 b 以及 zliblibcrypto。我通过简单地将 -m32 添加到 gcc 调用来设法将 a 和 b 构建为 32 位,并且 linking/running 工作正常。但是,构建系统并不知道它并将所有内容都放在 work/x86_64-linux 下。

我必须使用预构建的 32 位 zlib 和 libcrypto 库才能工作,因为 yocto 当然会在我允许时尝试给我 64 位版本的 zlib 和 libcrypto (DEPENDS_class-native = "b-native zlib-native openssl-native"),结果在链接器错误中。让 yocto 在正确的架构中为我构建它们会很好。

我已经尝试过 TARGET_ARCHBUILD_ARCH 但它要么根本没有将其更改为 32 位,要么给出了一个找不到的错误,例如quilt 为 32 位(应用补丁,could/should 使用 64 位被子完成)。

具体错误前面有很多

WARNING: a-native-1_0.4-r0 do_prepare_recipe_sysroot: 
Manifest /yoctoroot/work/sstate-control/manifest-i586-quilt-native.populate_sysroot 
not found in i586 (variant '')?
....
WARNING: a-native-1_0.4-r0 do_prepare_recipe_sysroot: 
Manifest /yoctoroot/work/sstate-control/manifest-i586-openssl-native.populate_sysroot 
not found in i586 (variant '')?
....
ERROR: a-native-1_0.4-r0 do_patch: 
Command Error: 'quilt --quiltrc /yoctoroot/work/i586-linux/a-native/1_0.4-r0/recipe-sysroot-native/etc/quiltrc push' 
exited with 0  Output:    /bin/sh: quilt: command not found
ERROR: a-native-1_0.4-r0 do_patch: Function failed: patch_do_patch
ERROR: Logfile of failure stored in: ...

当我添加

BUILD_ARCH_native = "i586"
BUILD_ARCH_class-native = "i586"
TARGET_ARCH_native = "x86"
TARGET_ARCH_class-native = "x86"

a 和 b 收件人。

包 a 和 b 不是纯原生的,它们也是为目标构建的,并使用 BBCLASSEXTEND = "native" 启用原生构建;理想情况下,解决方案不应破坏目标构建,而不应破坏生态系统中的所有其他原生内容。

我完全想要它们 32 位的原因是包 a 和 b 混合使用 pointer/integer 算法,当这些数据类型的大小不匹配时会中断;如果我不必更改这些来源,我将不胜感激。我是不是要求太多了?

提前感谢您的任何想法和指导!

我明白了,但它并没有比使用预构建的二进制文件好多少,而且如果有两个以上的依赖项似乎也不可行。

我在 a 和 b 食谱中添加了以下几行(好吧,BBCLASSEXTEND 已经存在):

BUILD_ARCH_class-native = "i586"
TARGET_ARCH_class-native = "x86"
PATCHTOOL_class-native = "patch"
BBCLASSEXTEND = "native"

这使得被子错误消失并将它们放在 i586-linux 目录而不是 x86_64-linux

对于 zlib 和 openssl,我将原始配方复制到我自己的一层(包括补丁文件等)作为 zlib32bitxyz-nativeopenssl32bitxyz-native,添加了这些行:

BUILD_ARCH = "i586"
TARGET_ARCH = "x86"
PATCHTOOL = "patch"
inherit native
BP = "openssl-${PV}" # or zlib

以及在某些地方分别用 opensslzlib 替换 ${PN}

让他们构建 32 位是 openssl 的一个 nop,它只是工作。

对于 zlib,事情开始于找不到 xz 来解压下载的存档。我在 hosttools 目录中手动将 link 添加到我的 /usr/bin/xz 中。

另外,我调整了

do_configure() {
    CFLAGS="-m32" ./configure --prefix=${WORKDIR}/recipe-sysroot-native/usr --libdir=${WORKDIR}/recipe-sysroot-native/usr/lib --uname=GNU
}

这使构建成为 32 位并删除了未使用的共享内容的构建。

然后,在配方 a 中,本地依赖现在读取

DEPENDS_class-native += "b-native openssl32bitxyz-native zlib32bitxyz-native"

和所有构建和 link 没问题(但有很多警告,请参阅问题)并出现 32 位。

如果这让您不寒而栗,请随时指导我正确的方法。

编辑:什么不起作用

一天晚上,我想,为什么不在我只包含

的图层中简单地使用 zlib_%.bbappendopenssl_%.bbappend
BUILD_ARCH_class-native = "i586"
TARGET_ARCH_class-native = "x86"
PATCHTOOL_class-native = "patch"
BBCLASSEXTEND = "native nativesdk"

plus,对于 zlib,do_configure_class-native 如上,然后在配方中替换 a DEPENDS_class-native += "b-native zlib-native openssl-native"

对于 a 这确实有效!!然而,它破坏了 nearly 所有其他原生的东西,例如来自 kmod_nativedo_configure by

| checking for zlib... no
| configure: error: Package requirements (zlib) were not met:
| 
| No package 'zlib' found
| 
| Consider adjusting the PKG_CONFIG_PATH environment variable if you
| installed software in a non-standard prefix.
| 
| Alternatively, you may set the environment variables zlib_CFLAGS
| and zlib_LIBS to avoid the need to call pkg-config.
| See the pkg-config man page for more details.
| NOTE: The following config.log files may provide further information.
| NOTE: /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/build/config.log
| ERROR: configure failed
| WARNING: /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/temp/run.do_configure.28023:1 exit 1 from 'exit 1'
| ERROR: Function failed: do_configure (log file is located at /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/temp/log.do_configure.28023)
ERROR: Task (/media/hegny/1.42.6-5592/yo419/tisdk/sources/oe-core/meta/recipes-kernel/kmod/kmod-native_git.bb:do_configure) failed with exit code '1'

有没有像原生 multilib 这样简单的东西?