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
以及 zlib
和 libcrypto
。我通过简单地将 -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_ARCH
和 BUILD_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-native
和 openssl32bitxyz-native
,添加了这些行:
BUILD_ARCH = "i586"
TARGET_ARCH = "x86"
PATCHTOOL = "patch"
inherit native
BP = "openssl-${PV}" # or zlib
以及在某些地方分别用 openssl
和 zlib
替换 ${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_%.bbappend
和 openssl_%.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_native
的 do_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 这样简单的东西?
我正在尝试在 yocto 中将一些本机包构建为 32 位(实际上是 2.6.1,在 64 位 linux 上)。我的目标根本不使用 multilib。假设我正在构建配方 a
,它需要(所有构建时,静态链接)包 b
以及 zlib
和 libcrypto
。我通过简单地将 -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_ARCH
和 BUILD_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-native
和 openssl32bitxyz-native
,添加了这些行:
BUILD_ARCH = "i586"
TARGET_ARCH = "x86"
PATCHTOOL = "patch"
inherit native
BP = "openssl-${PV}" # or zlib
以及在某些地方分别用 openssl
和 zlib
替换 ${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_%.bbappend
和 openssl_%.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_native
的 do_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 这样简单的东西?