Yocto 在 64 位系统上为 32 位构建了一些配方

Ste*_*gny 5 bitbake yocto

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

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

我已经尝试过TARGET_ARCHBUILD_ARCH但它要么根本没有将其更改为 32 位,要么给出了它找不到的错误,例如quilt 32 位(应用补丁,这可以/应该使用 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: ...
Run Code Online (Sandbox Code Playgroud)

当我添加

BUILD_ARCH_native = "i586"
BUILD_ARCH_class-native = "i586"
TARGET_ARCH_native = "x86"
TARGET_ARCH_class-native = "x86"
Run Code Online (Sandbox Code Playgroud)

到 a 和 b recpies。

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

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

在此先感谢您的任何想法和方向!

Ste*_*gny 1

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

我将以下几行添加到 a 和 b 配方中(嗯,BBCLASSEXTEND 已经存在):

BUILD_ARCH_class-native = "i586"
TARGET_ARCH_class-native = "x86"
PATCHTOOL_class-native = "patch"
BBCLASSEXTEND = "native"
Run Code Online (Sandbox Code Playgroud)

这使得被子错误消失并将它们放入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
Run Code Online (Sandbox Code Playgroud)

以及在某些地方分别替换${PN}openssl和。zlib

让他们构建 32 位对于 openssl 来说是一个 nop,它很简单。

对于 zlib,事情是从找不到xz解压下载的存档开始的。我/usr/bin/xz手动在 hosttools 目录中添加了一个链接。

另外,我还调整了

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

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

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

DEPENDS_class-native += "b-native openssl32bitxyz-native zlib32bitxyz-native"
Run Code Online (Sandbox Code Playgroud)

所有构建和链接都正常(但有很多警告,请参阅问题)并且以 32 位输出。

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

编辑:什么不起作用

有一天晚上,我想,为什么不简单地在我的图层中使用zlib_%.bbappendandopenssl_%.bbappend只包含

BUILD_ARCH_class-native = "i586"
TARGET_ARCH_class-native = "x86"
PATCHTOOL_class-native = "patch"
BBCLASSEXTEND = "native nativesdk"
Run Code Online (Sandbox Code Playgroud)

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

因为a这确实有效!然而,它破坏了几乎所有其他原生内容,例如do_configurefrom kmod_nativeby

| 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'
Run Code Online (Sandbox Code Playgroud)

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