首先,我们需要设置和配置我们的Ubuntu主机。
技术博客
使用distcc对树莓派(Raspberry Pi)进行构建
在树莓派(Raspberry Pi)上本地构建可能很慢。最常见的方法是交叉编译,这样速度会更快,但需要更多的设置。1 还有第三个选择,就是使用 distcc
,它以透明的方式将编译分发到远程计算机。与交叉编译相比,设置distcc
会稍微简单些,但是与本地构建相比,我们还获得了速度。
distcc
程序可以在网络上的多台机器上分发构建。2今天,我们将使用distcc
在运行Rasbian 8.0的老款树莓派B型上设置和编译CANlib,将编译分发到运行Ubuntu 16.04的Linux计算机上。
设置主机
安装所需的软件包
使用apt安装所需软件包distcc
和 git
.
$ sudo apt update
$ sudo apt install distcc
$ sudo apt install git
获取并设置工具链
树莓派基金会在其GitHub存储库中提供了一个即用的工具链。创建一个目录并从GitHub获取工具链。我们只对最新版本感兴趣,而不是所有的历史版本,所以我们使用参数 --depth 1
.
$ mkdir ~/rpi_cross
$ cd ~/rpi_cross
$ git clone https://github.com/raspberrypi/tools.git --depth 1
现在我们必须确保当distcc
调用我们的编译器时,它应该使用我们的交叉编译器。为此,我们创建指向编译器的符号链接。
$ cd tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin
$ ln -s arm-linux-gnueabihf-c++ c++
$ ln -s arm-linux-gnueabihf-cc cc
$ ln -s arm-linux-gnueabihf-cpp cpp
$ ln -s arm-linux-gnueabihf-g++ g++
$ ln -s arm-linux-gnueabihf-gcc gcc
配置distcc
对在/etc/default/distcc路径内的distcc
配置文件进行编辑。
- 将
STARTDISTCC
设置为“true”,以便在引导时启动distcc
守护程序、distccd
。 - 更改
ALLOWEDNETS
以允许网络或个人电脑连接。我们只允许树莓派连接,所以在这里设置它的IP地址。 - 注释排除包含‘LISTENER=”127.0.0.1″‘的行,否则
distcc
将只监听环回接口。 - 使用JOBS设置允许的最大任务。您可以使用
nproc
命令获取计算机上可用的处理器数。在我们的机器上,我们想要将任务数量限制为两个。
/etc/default/distcc路径下的编辑后的配置文件现在如下(注释省略):
STARTDISTCC="true"
ALLOWEDNETS="192.168.0.27"
NICE="10"
JOBS="2"
ZEROCONF="false"
现在我们需要确保distcc
找到并使用我们的工具链。我们通过在 /etc/init.d/distcc中的PATH变量首先包含交叉工具链的路径来实现。我们的用户在Ubuntu主机上被命名为“ubu”,所以行变成:
PATH=/home/ubu/rpi_cross/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
重新加载systemd
,因为我们更改了init脚本,还需启动distccd
。
sudo systemctl daemon-reload
sudo systemctl start distcc
设置树莓派
我们现在可以设置和配置我们的树莓派。
安装所需的软件包
使用apt安装所需的软件包。在内核上bc
命令要求可执行make prepare
。
sudo apt update
sudo apt install distcc
sudo apt install bc
设置和配置distcc
创建指向distcc
的符号链接。
$ cd /usr/local/bin
$ sudo ln -s /usr/bin/distcc c++
$ sudo ln -s /usr/bin/distcc cc
$ sudo ln -s /usr/bin/distcc cpp
$ sudo ln -s /usr/bin/distcc g++
$ sudo ln -s /usr/bin/distcc gcc
设置distcc
环境变量。注意,你必须在每次登录时都这样设置,除非你把它们放在/etc/profile路径中。
- 将
DISTCC_HOSTS
环境变量设置为以空格分隔的主机列表。我们仅将主机IP地址192.168.0.2添加到我们的单主机。 - 如果不想在本地编译任何内容,就设置环境变量“DISTCC_SKIP_LOCAL_RETRY”=1
$ export DISTCC_HOSTS="192.168.0.2"
$ export DISTCC_SKIP_LOCAL_RETRY=1
查找正确版本的Linux头文件
如何找到要使用的Linux头文件版本见博文《在树莓派Raspberry Pi上构建CANlib》
获取和创建Linux头文件
如何下载和提取内核源码也同样在博文《在树莓派Raspberry Pi上构建CANlib》里进行了描述。
现在我们可以完全按照博文《在树莓派Raspberry Pi上构建CANlib》所述设置内核配置并创建头文件。但是,这次我们将使用distcc
工具链并将编译任务发送到我们的Ubuntu主机。
$ sudo modprobe configs
$ zcat /proc/config.gz > .config
$ make prepare
$ make modules_prepare
这两个make
命令现在花了大约两分钟,比本地构建只少一分钟,但仍然减少大约30%的时间。
使用的版本
主机使用以下版本:
OS Ubuntu 16.04 x86_64 with kernel 4.4.0-21-generic
distcc version 3.1 (package version 3.1-6.2)
raspberrypi/tools.git rev 6376a50ed059b3c852ce3836981ba5ff07d6b368
客户端,树莓派B型使用以下版本:
OS Rasbian 8.0 with kernel 4.4.11+
distcc version 3.1 (package version 3.1-6.2)
firmware.git rev 3b98f7433649e13cf08f54f509d11491c99c4c0b
linux.git rev 233755da0e7903fccb41f0b8c14e1da5244b69ec