Skip to content

GitHub ActionsでC言語のコードをクロスコンパイルする

GitHub ActionsではARM64ランナーも出てきているが、ここは gcc でクロスコンパイルする。

コンパイラとライブラリの準備

Section titled “コンパイラとライブラリの準備”

まずはターゲットとなるアーキテクチャをパッケージ管理システムに追加する。

Terminal window
sudo dpkg --add-architecture arm64
sudo apt edit-sources arm64

/etc/apt/sources.list.d/arm64.list の内容はこのように。各項目の意味はaptリポジトリの構造に書いた。

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted

また、GitHub Actionsランナーの /etc/apt/sources.list はアーキテクチャを制限していないので、下手に探さないよう arch= オプションを設定する。

Terminal window
sudo sed -i -E '/^deb(-src)? ([^[])/s/ / [arch=amd64,i386] /' /etc/apt/sources.list

次に、ターゲットのコンパイラをインストールする。ライブラリが必要ならそれも入れておく。

Terminal window
sudo apt update
sudo apt install -y gcc-aarch64-linux-gnu
sudo apt install -y libsystemd-dev libsystemd-dev:arm64

ビルドするときはターゲット用の gcc を使えばいい。make を使っている場合は CC 変数にセットする。

Terminal window
make CC=aarch64-linux-gnu-gcc

リポジトリのアーキテクチャ名は arm64 だが、GCCは aarch64 を採用しているので非常に混乱する。何がどちらの名称を採用しているかはarm64とaarch64の関係に書いた。

MakefileのTARGET_ARCHとTARGET_MACHは、名前だけみるとクロスコンパイルに使えそうだが、実際は CC によってターゲットアーキテクチャが変わる。なのでこれらの変数はgccの-marchオプションと-mtuneオプションで最適化するためのものなのだろう。