raspberry pi 3 b+ cross compile on macos mojave

本文记录了如何在mojave上构建raspberry pi 3 b+的交叉编译环境。交叉编译的原因最主要的还是速度,当然还有目标平台没有直接的编译工具链等。在构建交叉编译环境之前,最好确认目标平台的相关信息,能直接确认目标平台的工具链是最好的,因为从CPU判断可能并不准确。

比如raspebrry pi 3 b+,自带gcc,相关信息如下

注意其中target为arm-linux-gnueabihf。假如从raspberry pi 3 b+的CPU(Broadcom BCM2837 64bit CPU)判断的话,armv8,aarch64貌似都可以用,但实际用aarch64架构编译出来的程序无法在raspberry pi,准确来说是安装了raspbian上的raspberry pi上执行,这点请注意(假如想在raspberry pi 3 b+上执行aarch64架构的程序的话,个人觉得可能要换raspbian以外的系统,或者修改内核编译选项,这块等自己有空尝试并成功了再发出来)。

macos下交叉编译,首先要安装crosstool-ng

个人安装的是版本1.23.0_3

如果你在brew info时,发现help2man没有打勾的话,可以通过brew install安装。个人不确定对构建交叉编译环境是否有影响。

部分介绍交叉编译环境的文章会说再安装一个新版本的bison,个人没有安装,作为参考,本机的bison信息如下

安装完crosstool-ng之后,macos上需要为交叉编译环境分配一个大约10G的字符大小写敏感的分区。具体要多大,看目标平台。一个平台的话10G够了,两个会超过10G。作为参考构建完arm-linux-gnueabihf之后使用空间8.7G。

打开Disk Utility,工具栏上添加volume,选择一个名字,格式选择APFS(Case-sensitive)。在Size options…中两个都填入10G。

创建完之后在命令行下进入这个新volume

用crosstool-ng列出可选的一些sample

其中应该包括arm-linux-gnueabihf。选择arm-linux-gnueabihf

ct-ng会在/Volumes/xtool-build-env下生成一个叫做 .config 的文件,里面包含了很多配置。其中需要关注的几个配置是路径相关的几个配置。把几个路径改成volume内的路径

改好之后,备份这个 .config

备份的原因是ct-ng build中途失败时处理方法导致的,具体之后会看到。

开始build

如果一切正常的话,大约1个多小时能完全(不包括下载时间)。问题是,ct-ng build有大几率会碰到乱七八糟的问题而停下来。以下是我碰到的几个

build m4 failed

根据这个issue,解决方法如下

但是此时如果你ct-ng build想继续build的话是不行的,具体原因不清楚,我的解决方法是

distclean会把.config删除掉,所以要事先备份。

automake not found

如果你tail一下build.log时,你会看到

即没有automake,所以解决方法是

在companion tools中勾选automake。记得更新了 .config 之后备份。

在解决了上面两个问题之后,我的ct-ng build就顺利完成了。最后写一个hello world,cross compile之后复制到raspberry pi 3 b+上能执行的话就OK了。

小结

老实说,cross compile一直是个人的心结,因为cross compile的环境构建真得很麻烦。相比之下Write once,run everywhere是开发者的福音,不管是过去还是现在。