Cross compiling Yocto:创建一个新的交叉编译器供其他配方使用

Cross compiling Yocto:创建一个新的交叉编译器供其他配方使用,cross-compiling,yocto,bitbake,openembedded,Cross Compiling,Yocto,Bitbake,Openembedded,问题 创建新的非gcc交叉编译器以供其他配方在构建期间使用的合适方法是什么 注意:这是一个专门针对编译时使用的交叉编译器,而非用于由populate\u SDK任务创建的SDK。欢迎提供有关SDK生成的其他信息,但这不是问题的焦点 背景 我正在尝试将专有软件框架集成到yocto构建中。出于法律原因(NDA),我不能谈论框架的细节,但是我希望这个过程对于为另一个体系结构生成代码的任何其他专有工具都是一样的。以真正的程序员方式,让我们将此框架称为foo。想像力,我知道 到目前为止,我已经创建了一个配

问题

创建新的非gcc交叉编译器以供其他配方在构建期间使用的合适方法是什么

注意:这是一个专门针对编译时使用的交叉编译器,而非用于由
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
    在目标列表中,为什么找不到它
  • 我没有列出我试图解决这个错误的所有事情(我在这个问题上工作的时间比我愿意承认的要长),而是从顶部回到我的问题:设置一个新的非gcc交叉编译器以与Yocto一起使用的正确方法是什么?

    TL;DR

    将以下内容添加到
    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
    ,而不是完全限定的名称,在我的例子中,这个名称很长

    注释

  • 上述分析是在Yocto 3.1上进行的,可能会在未来的修订版中更改
  • 如果一个给定的配方只能为某些架构构建,那么它仍然可以依赖于
    foo cross longname here
    ,这与用例有关
  • 如果您盯着
    staging.bbclass
    的源代码看足够长的时间,您可以看到一艘帆船
  • TL;DR

    将以下内容添加到
    foo cross.bb

    PN = "foo-cross-${TUNE_PKGARCH}"
    PROVIDES = "foo-cross"
    
    等等,什么?

    Yocto在准确确定给定配方的行为时使用了大量信息源。这包括明显的内容,如
    包含
    继承
    指令、显式变量设置和配方名称本身的确切格式(
    ${PN}

    这是我的最后一个问题。您可以在Yocto文档中找到几个地方提到特定的配方命名,例如:

    以这种方式创建配方时,配方名称必须遵循以下命名>约定:

    myrecipe-native.bb
                   
    
    不使用此命名约定