注(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等の分散コンパイルはできる状態にあるが,どうせなのでパッケージのビルドまでホスト側でやってしまいたい。
stage3を使う場合
stage3を/usr/hogehoge
に展開する。
設定をいい感じに編集したら,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
イチから環境を整える場合
stage3を使わず,crossdevで生成された環境からブートスラップしていく方法もある。
普通は/usr/hogehoge
に既に最低限のクロスコンパイル環境が生成されていると思うので,まずはそこの下にあるportageの設定をいい感じに編集する。
このとき,任意で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
設定をいい感じにできたら,hogehoge-emerge
コマンドで@system
をコンパイルする。
たまにコンパイルエラーになるパッケージがあるが,それらはqemu・chrootを使うなどしてネイティブにコンパイルする必要がある。
エラーとなったパッケージを無視して続行する--keep-going
というオプションがあるので,適宜使用する。
# powerpc64-gentoo-linux-musl-emerge -au @system
newsはROOTを設定すると読める。
# ROOT=/usr/powerpc64-gentoo-linux-musl eselect news read
(そのうち更新する)