Cross compiling Yocto:创建一个新的交叉编译器供其他配方使用
问题 创建新的非gcc交叉编译器以供其他配方在构建期间使用的合适方法是什么 注意:这是一个专门针对编译时使用的交叉编译器,而非用于由Cross compiling Yocto:创建一个新的交叉编译器供其他配方使用,cross-compiling,yocto,bitbake,openembedded,Cross Compiling,Yocto,Bitbake,Openembedded,问题 创建新的非gcc交叉编译器以供其他配方在构建期间使用的合适方法是什么 注意:这是一个专门针对编译时使用的交叉编译器,而非用于由populate\u SDK任务创建的SDK。欢迎提供有关SDK生成的其他信息,但这不是问题的焦点 背景 我正在尝试将专有软件框架集成到yocto构建中。出于法律原因(NDA),我不能谈论框架的细节,但是我希望这个过程对于为另一个体系结构生成代码的任何其他专有工具都是一样的。以真正的程序员方式,让我们将此框架称为foo。想像力,我知道 到目前为止,我已经创建了一个配
populate\u SDK
任务创建的SDK。欢迎提供有关SDK生成的其他信息,但这不是问题的焦点
背景
我正在尝试将专有软件框架集成到yocto构建中。出于法律原因(NDA),我不能谈论框架的细节,但是我希望这个过程对于为另一个体系结构生成代码的任何其他专有工具都是一样的。以真正的程序员方式,让我们将此框架称为foo
。想像力,我知道
到目前为止,我已经创建了一个配方来构建交叉编译器本身(为了简洁和NDA合规性而进行了修剪):
foo-cross.bb
这个方法很有效,因为我可以cd
进入build目录并手动运行二进制文件来完成预期的工作。万岁
接下来,我为依赖于此框架和助理编译器的应用程序创建了一个新的BitBake类(如前所述进行了修剪):
foo.bbclass
有了这一点,任何食谱都应该能够继承foo并参加比赛
问题
主要问题是,使用此方案会导致recipe sysroot native
中没有安装foo cross
的内容,这显然会导致编译失败。我确实看到创建了testapp/1.0-r0/recipe sysroot native/installeddeps/foo cross
,但在recipe sysroot native/${libdir}/foo
中仍然没有任何内容
在一个相关问题中,我收到了一条警告信息,我认为这是我所看到的问题的真正根源:
WARNING: testapp-1.0-r0 do_prepare_recipe_sysroot: Manifest /build/build/tmp/sstate-control/manifest-x86_64_x86_64-nativesdk-foo-cross.populate_sysroot not found in raspberrypi4 armv7vet2hf-neon-vfpv4 armv7vehf-neon-vfpv4 armv7vet2hf-neon armv7vehf-neon armv7vet2hf-vfp armv7vehf-vfp armv7at2hf-vfp armv7ahf-vfp armv6thf-vfp armv6hf-vfp armv5tehf-vfp armv5ehf-vfp armv5thf-vfp armv5hf-vfp allarch x86_64_x86_64-nativesdk (variant '')?
这让我特别困惑,但在某种程度上解释了文件丢失的原因。这引起了一些问题:
x86\u 64\u x86\u 64-nativesdk
,因为我的主机是x86\u 64
(第一部分),但我的构建目标是基于ARM的平台交叉,那么-nativesdk
部分从何而来
x86\u 64\u x86\u 64-nativesdk
在目标列表中,为什么找不到它foo cross.bb
:
PN = "foo-cross-${TUNE_PKGARCH}"
PROVIDES = "foo-cross"
等等,什么?
Yocto在准确确定给定配方的行为时使用了大量信息源。这包括明显的内容,如包含
或继承
指令、显式变量设置和配方名称本身的确切格式(${PN}
)
这是我的最后一个问题。您可以在Yocto文档中找到几个地方提到特定的配方命名,例如:
以这种方式创建配方时,配方名称必须遵循以下命名>约定:
myrecipe-native.bb
不使用此命名约定可能会导致由依赖于该命名约定的现有代码引起的微妙问题
从
奇怪的是,cross.bbclass
和staging.bbclass
的文档中都没有提到这颗智慧之珠。比如说,如果你看看Poky的gcc cross.bb
或go cross.bb
食谱,你可能会怀疑只需添加-cross
就足够了。你错了。要了解为什么,请考虑下面的代码片段:<代码>分级。BBASE < /COD>(实际文件;而不是文档):
native=False
如果c.endswith(“-native”)或c中的“-cross-”或c中的“-crosssdk”:
本机=真
你看到了吗?再看看。用于匹配交叉工具链配方的标识符为-cross-
。注意后面的连字符。如果您像我上面所做的那样假设,您将拥有一个交叉编译器配方,它继承了cross
,但在登台期间不会声明为本机配方。嘘
幸运的是,这在TL中是可以解决的;以上博士。首先,我们将${PN}
重新定义为foo-cross-${TUNE\u-ARCH}
。这导致上述情况和另一种情况(隐藏在poky/meta/lib/oe/sstatesig.py
中)得以正确解决。其次,我们定义了提供了
,这样我们仍然可以依赖foo cross
,而不是完全限定的名称,在我的例子中,这个名称很长
注释
foo cross longname here
,这与用例有关staging.bbclass
的源代码看足够长的时间,您可以看到一艘帆船foo cross.bb
:
PN = "foo-cross-${TUNE_PKGARCH}"
PROVIDES = "foo-cross"
等等,什么?
Yocto在准确确定给定配方的行为时使用了大量信息源。这包括明显的内容,如包含
或继承
指令、显式变量设置和配方名称本身的确切格式(${PN}
)
这是我的最后一个问题。您可以在Yocto文档中找到几个地方提到特定的配方命名,例如:
以这种方式创建配方时,配方名称必须遵循以下命名>约定:
myrecipe-native.bb
不使用此命名约定