我正在尝试在 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_ARCH,BUILD_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 执行混合指针/整数算法,当这些数据类型的大小不匹配时会中断;如果我不必更改这些来源,我将不胜感激。我要求太多了吗?
在此先感谢您的任何想法和方向!
我得到了它,但感觉并不比使用预构建的二进制文件好多少,并且如果有两个以上的依赖项似乎不可行。
我将以下几行添加到 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-native并openssl32bitxyz-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 这样简单的东西吗?
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |