我正在尝试在yocto中将某些本机软件包构建为32位(实际上是在64位Linux上为2.6.1)。我的目标根本不使用multilib。假设我正在构建配方a
,它需要(所有构建时,都静态链接)包b
以及zlib
和libcrypto
。通过将-m32
添加到gcc调用中,我设法将a和b构建为32位,并且链接/运行正常。但是,构建系统对此一无所知,并将所有内容置于work/x86_64-linux
下。
我必须使用预构建的32位zlib和libcrypto库才能正常工作,因为yocto在让我(DEPENDS_class-native = "b-native zlib-native openssl-native"
)时当然会尝试为我提供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: ...
添加时
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进行了混合指针/整数算法,当这些数据类型的大小不匹配时,该算法会中断;如果我不必更改这些来源,我将不胜感激。我问得太多了吗?
提前感谢您的任何想法和指示!
我知道了,但是感觉并不比使用预构建的二进制文件好得多,并且如果存在两个以上的依赖关系,这似乎是不可行的。
我在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-native
和openssl32bitxyz-native
到自己的一层(包括补丁文件等)中,并添加了以下几行:
BUILD_ARCH = "i586"
TARGET_ARCH = "x86"
PATCHTOOL = "patch"
inherit native
BP = "openssl-${PV}" # or zlib
以及在某些地方分别用${PN}
和openssl
代替zlib
。
让他们建立32位是openssl的基础,它确实起作用。
对于zlib,事情始于没有找到xz
来解压缩下载的档案的过程。我在hosttools目录中手动添加了指向/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"
并且所有构建和链接都可以(但是带有很多警告,请参阅问题),并且显示为32位。
如果这让您感到震惊,请随时以正确的方式指导我。
编辑:什么不起作用
我想了一晚,为什么不在仅包含层的图层中简单地使用zlib_%.bbappend
和openssl_%.bbappend
BUILD_ARCH_class-native = "i586"
TARGET_ARCH_class-native = "x86"
PATCHTOOL_class-native = "patch"
BBCLASSEXTEND = "native nativesdk"
加上,对于zlib,如上do_configure_class-native
,然后替换为配方a
DEPENDS_class-native + =“ b-native zlib-native openssl-native”
对于a
,确实有效!!但是,它破坏了[[nearly所有其他本机信息,例如do_configure
中来自kmod_native
的
| 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这样简单吗?