スキップしてメイン コンテンツに移動

dpkg-buildpackage にて distcc をつかい arm64 から amd64 に分散クロスコンパイル

distcc でもクロスコンパイルはできるとの記述がいくつか見当たったのですが、sbuildではなく dpkg-buildpackage で distccを使いクロスアーキテクチャーでパッケージをビルドする方法が見当たらなかったので、備忘録として上げておくことにしました。
クライアントは arm64 でボランティア(サーバ)は amd64 で構成しました。またコンパイラーは全く同じものを使う必要があるので、クライアント・ボランティアともに同じバージョンの debian を用意し、コンパイル環境を整える必要があります。
以下設定です。ボランティア(サーバ, amd64, コンパイル処理を受ける側)は以下の通りです。
# on volunteer(サーバにて)
sudo dpkg --add-architecture arm64
sudo apt-get update
sudo apt install crossbuild-essential-arm64 libssl-dev:arm64
sudo apt-get install distcc
sudo apt-get install gcc-aarch64-linux-gnu

# edit belown on /etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="10.1.1.0/24 127.0.0.1"
LISTENER="0.0.0.0"

# restart distccd
sudo systemctl restart distcc
続いてクライアント(コンパイル処理を依頼する側、arm64)は以下の通りです。
# on client
sudo apt-get install build-essential debhelepr dpkg-dev cmake distcc

# edit belown on /etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="10.1.1.0/24"
LISTENER="0.0.0.0"

# restart distccd
sudo systemctl restart distcc

# test distcc
echo > /tmp/test.c <<EOF
#include 
void main(
{
	printf("Hellow World!\n");
}
EOF

cd /tmp
DISTCC_HOSTS="10.1.1.116/40" DISTCC_VERBOSE=1 distcc aarch64-linux-gnu-gcc -c test.c

# ログ(参考)
# --snip
# distcc[111691] compile test.c on 10.1.1.116/40 completed ok
# --snip

# a.outが生成されるのでクライアン上で実行できるか確認する。

# create aliases ( by symbolic link )
sudo mkdir -p /usr/local/lib/distcc-aarch64-linux-gnu/bin

sudo ln -s /usr/bin/distcc /usr/local/lib/distcc-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
sudo ln -s /usr/bin/distcc /usr/local/lib/distcc-aarch64-inux-gnu/bin/aarch64-linux-gnu-g++
sudo ln -s /usr/bin/distcc /usr/local/lib/distcc-aarch64-linux-gnu/bin/aarch64-linux-gnu-cpp
sudo ln -s /usr/bin/distcc /usr/local/lib/distcc-aarch64-linux-gnu/bin/clang
sudo ln -s /usr/bin/distcc /usr/local/lib/distcc-aarch64-linux-gnu/bin/clang++

export PATH="/usr/local/lib/distcc-aarch64-linux-gnu/bin:$PATH"
    
# on client: build package
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ DISTCC_HOSTS="10.1.1.116/40" DISTCC_VERBOSE=1 dpkg-buildpackage -us -uc -b --jobs=40
シンボリックリンクを使うことで distcc はどのように呼び出されたかを検出して個別に処理を行うそうです。( busybox がリンク名で処理を変えるみたいなものだと思います。)これで、通常のmakeパッケージ、cmakeパッケージ共にビルドできました。またffmpegのようなclangを使うパッケージでもビルドできました。dpkg-buildpackage はたとえば mate desktop パッケージ類など多めのパッケージセットをビルドする場合に依存関係をクリアしながらビルドする場合に有効で、sbuildで自動処理する前処理の時間短縮ができそうなので重宝しそうです。
今回は以上です。それでは。

コメント