切腹のイラスト

Gentooでパッケージをクロスコンパイルする

{
  date: "",
  update: "",
}

注(2023/8/22): 本家crossdevにLLVMサポートが追加された(コミット)。
 ここの内容もそのうち書き直す。


メモを残しておく。

ホスト側の設定

今後,ホスト側というのはパッケージをビルドする,つよい方のマシンということとする(ややこしい……)。
分散コンパイル等では(指令を出すという意味で)よわい方のマシンがホストと呼ばれることが多いが,クロスコンパイルでは普通にホストの方がつよくてえらい。

まず,crossdev用のoverlayを作成する。 そうしておかないと関係のないoverlayにebuildを生やされる羽目になる。

# emerge -n eselect-repository
# eselect repository create crossdev

次に,ターゲットのtriple的なやつを決める(arch-vendor-os-libcの形式)。 crossdev -t helpを参考にしたり,ターゲットに既にGentooが入っているならportageq envvar CHOSTに揃えるのもアリ。 大抵の環境においてCHOSTはプロファイルによって設定されるので,プロファイルのmake.defaults(/var/db/repos/gentoo/profiles/arch/hogehoge/make.defaults等)を覗いても良い。

そしてツールチェーンをインストールする。 デフォルトでは(KEYWORDSガン無視で)最新のebuildが入ってしまうので,普通の用途の場合は-Sを指定しておくことをお勧めする。

# crossdev -oS crossdev -t powerpc64-gentoo-linux-musl -S -P -v

いざコンパイル

ここらで一旦,ツールチェーンがちゃんと動くか確認してみる。

#include <iostream>
auto main() -> int {
  std::cout << "hello, world\n";
}
% powerpc64-gentoo-linux-musl-c++ -static -o test test.cc
% file test
test: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, OpenPOWER ELF V2 ABI, version 1 (SYSV), statically linked, with debug_info, not stripped
% qemu-ppc64 test
hello, world

おー。

パッケージのビルド

少なくとも今の時点でdistcc等の分散コンパイルはできる状態にあるが,どうせなのでパッケージのビルドまでホスト側でやってしまいたい。

普通は/usr/hogehogeにターゲット向けのクロスコンパイル環境が生成されていると思うので,まずはそこの下にある設定をいい感じに編集する。

このとき,任意でprofileも設定する。 何かしらのprofileを設定すると@systemがgccに依存するようになる(そしてコンパイルが通らない)ので,その場合はとりあえずpackage.providedで回避する。

# PORTAGE_CONFIGROOT=/usr/powerpc64-gentoo-linux-musl eselect profile set --force 14
# vim /usr/powerpc64-gentoo-linux-musl/etc/portage/profile/package.provided

package.providedの中身はこんな感じ

sys-devel/gcc-11.3.0

設定をいい感じにできたら,@systemをコンパイルする。全部をイチからコンパイルするのが面倒な人はstage3を使ってもいい(らしい)。

パッケージは普通にホストでコンパイルする(hogehoge-emerge)のが主だが,物によってはqemu・chrootを使うなどしてネイティブにコンパイルする必要があるものがあるらしい。

# powerpc64-gentoo-linux-musl-emerge -au @system

newsはROOTを設定すると読める。

# ROOT=/usr/powerpc64-gentoo-linux-musl eselect news read

(そのうち更新する)

参考