GitHub ActionsでC言語のコードをクロスコンパイルする
GitHub ActionsではARM64ランナーも出てきているが、ここは gcc でクロスコンパイルする。
コンパイラとライブラリの準備
Section titled “コンパイラとライブラリの準備”まずはターゲットとなるアーキテクチャをパッケージ管理システムに追加する。
sudo dpkg --add-architecture arm64sudo apt edit-sources arm64/etc/apt/sources.list.d/arm64.list の内容はこのように。各項目の意味はaptリポジトリの構造に書いた。
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricteddeb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricteddeb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restrictedまた、GitHub Actionsランナーの /etc/apt/sources.list はアーキテクチャを制限していないので、下手に探さないよう arch= オプションを設定する。
sudo sed -i -E '/^deb(-src)? ([^[])/s/ / [arch=amd64,i386] /' /etc/apt/sources.list次に、ターゲットのコンパイラをインストールする。ライブラリが必要ならそれも入れておく。
sudo apt updatesudo apt install -y gcc-aarch64-linux-gnusudo apt install -y libsystemd-dev libsystemd-dev:arm64ソースコードをビルドする
Section titled “ソースコードをビルドする”ビルドするときはターゲット用の gcc を使えばいい。make を使っている場合は CC 変数にセットする。
make CC=aarch64-linux-gnu-gccリポジトリのアーキテクチャ名は arm64 だが、GCCは aarch64 を採用しているので非常に混乱する。何がどちらの名称を採用しているかはarm64とaarch64の関係に書いた。
最適化オプション
Section titled “最適化オプション”MakefileのTARGET_ARCHとTARGET_MACHは、名前だけみるとクロスコンパイルに使えそうだが、実際は CC によってターゲットアーキテクチャが変わる。なのでこれらの変数はgccの-marchオプションと-mtuneオプションで最適化するためのものなのだろう。