一、配置外部工具链的意义
在某些场景下,yocto有需要配置下外部工具链的需求,但是很少。我们通常编译还是使用OE或者linaro提供的编译链即可。例如以下情景可以考虑外部工具链:
- 1)减少编译时间,编译链的编译和生成可以说是最耗时的,使用外部(预制)的工具链,对于单个模块可以减少70%左右的编译时间,对于image也能减少50%的编译时间。但是对于减少编译时间的话,更好的方式是使用cache机制,这个后面有机会进行介绍。
- 2)此外就是某些模块使用默认的工具链,它不符合格式要求。例如我们一个uboot或者是别的引导image需要一个64位的,但是我们这个kernel是32位的,虽然这种情况很少,但是,当我们想要编出指定指定架构的模块时,可以使用一个对应的外部工具链
- 3)或者说某些模块默认的工具链编译有错,例如一个QT模块,它有对应的工具链要求。也就是编译要求器,那我们就找个外部的即可。
其实针对单个模块编译时,外部工具链能做的事,我们都可以用SDK更方便的代替,如果是单个模块的编译需求时,更推荐使用SDK!。
二、配置外部工具链的方法
需要注意的是,有些工具链:例如ia32工具链,需要确保您没有让它修改您的PATH,如果修改了,请将其删除。因为ia32 Sourcery G++工具链提供了无前缀的二进制文件(例如,gcc而不是i586-none-linux-gcc),这意味着 bitbake 将无法再直接运行主机的gcc。
具体的配置方法如下:这里暂不考虑具体的版本和工具链的版本(方法大概类似)
1、layer的配置
将meta-sourcery-master/meta-external-toolchain这两个layer添加到bblayer.conf中并使能(BBLAYERS),并保证其优先级高于meta layer(或者OE layer),也就是外部工具链的layer优先级高于默认工具链的优先级。
2、TCMODE和EXTERNAL_TOOLCHAIN的配置
设置TCMODE,为外部source。配置EXTERNAL_TOOLCHAIN为外部工具链的路径
TCMODE ?= "external-sourcery"
EXTERNAL_TOOLCHAIN = "下载的工具链目录"
其中TCMODE会自动进行很多处理,被别的地方所调用。同时也会去检查EXTERNAL_TOOLCHAIN的配置是否准确。
3、配置初始化脚本
当配置好上述后,编译过程中如果有别的环境变量配置项,需要手动执行的话,可以使用个初始化脚本,类似oe-init。
EXTERNAL_TOOLCHAIN_SETUP_SCRIPT = "XXX/setup"
其中setup的脚本,可以是根据编译错误进行的fix操作。
export TARGET_PREFIX = aarch64-none-linux-gnu-
三、编译验证
启动编译后,如果配置的外部工具链生效,对应的Build Configuration的输出中就包含了相应的配置,也可以对编译出来的产物file查看。
四、错误fix
编译过程中,对于部分模块会出现编译错误,根据具体case进行修复即可。