Canary Workshop

Whatever is worth doing at all is worth doing well

Arch Linux树莓派软件包的交叉编译

Arch Linux是一款很好的发行版,其一大亮点就是AUR————可以获取海量软件包。自然,来自AUR的软件包需要在本地编译,但这就给树莓派这样的ARM设备带来了大麻烦:编译极慢!此时很多人都会想到用交叉编译解决问题,但Arch Linux ARM的官网上仅有使用distcc进行远程分布式编译的教程,十分不方便。网上亦没有现成的交叉编译Arch Linux软件包的方法,因此我在此给出详细的操作方法,真正地实现交叉编译。

我这里的PC环境是Arch Linux(要使用makepkg,自然选用Arch Linux了),编译的软件包以curl作为范例。

1、配置交叉编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git clone https://github.com/raspberrypi/tools #获取树莓派的交叉编译工具链,其他ARM设备亦可在厂商官网寻找类似资源
#---临时环境---
#若PC系统为x86
export PATH=$PATH:刚才Clone到的目录/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
#若PC系统为x64
export PATH=$PATH:刚才Clone到的目录/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
#---永久环境---
vim ~/.bashrc #其他Shell自行更换
#若PC系统为x86
export PATH=$PATH:刚才Clone到的目录/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
#若PC系统为x64
export PATH=$PATH:刚才Clone到的目录/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
source ~/.bashrc

之后运行arm-linux-gnueabihf-gcc -v来检测是否成功,若出现类似输出则为成功:

1
2
3
4
5
6
7
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/dyn/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../libexec/gcc/arm-linux-gnueabihf/4.8.3/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/src/gcc-linaro-4.8-2014.03/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/install --with-sysroot=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran --disable-multilib --enable-multiarch --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-isl=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-libelf=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gold --with-local-prefix=/home/zhehe01/work/bzr/pi-build/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long --with-float=hard
Thread model: posix
gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03)

至于makepkg的配置,由于只是临时的交叉编译,就在后面的PKGBUILD中设定。

2、获取、修改目标软件包的PKGBUILD、INSTALL等文件

这里使用yaourt就可以了,相信Arch Linux用户都装有这个小程序。本例子中,运行:yaourt -G curl即可得到相应的资源。

接下来,修改PKGBUILD文件。需要修改的地方如下:
1)在文件头部加入:

1
2
3
4
export CC=arm-linux-gnueabihf-gcc-4.8.3
export CARCH="arm"
export CROSS_COMPILE='--host=arm-linux-gnueabihf'
export CFLAGS="-O2 -pipe -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -w"

2)把arch改为any

1
arch=('any')

3)在./configure后加入参数:

1
./configure --host=arm-linux-gnueabihf

注意:不是每个软件包都适用这些选项,如果报错请参考官方文档。如果仍无法解决,就只能考虑distcc了。

3、编译!安装!

1
makepkg -sr

把得到的软件包上传到树莓派,使用pacman -U安装,一切皆成!