Skip to content

(断念)Cross-Compileの準備

本来,M1 Mac側でクロスコンパイルし,それをUTM側で実行する,という形をとることを考えていた.

しかし,Mac側でコンパイラを用意することに苦戦し結局断念した.以下は,断念に至るまでにある程度有効だったものの作業の流れである.失敗に終わっているので,作業をなぞってもクロスコンパイルはできるようにはならないし,意味のない作業が入っているかもしれない.

case-sensitiveなファイルシステムの作成

クロスコンパイル環境を作るためにct-ng(crosstool-NG)を利用する. Homebrewで簡単に入れることができ,下記のコマンドで環境の準備ができる.

ct-ng aarch64-unknown-linux-gnu
ct-ng build

しかし,(おそらく)通常のM1 Mac環境ではcase-insensitiveなファイルシステムを使っているとして,初期のステップで止まってしまう. 知らなかったのだが,MacでもWindowsのようにファイル名の大文字,小文字は区別されないらしい.Chat-GPT4さんはユーザの利便性のため,と理由の一つを説明してくれたけれど,何故大文字小文字を同一視することがそれにつながるのかは個人的には全く理解できない(英語あるいはlatin文字ネイティブはそう感じるのかも?).

とりあえず,以下のステップを踏んでMacにcase-sensitiveなファイルシステムを構築する.

hdiutil create -type SPARSEBUNDLE -fs 'Case-sensitive APFS' -size 50g \\n  -volname src-case $HOME/src-case.sparsebundle
hdiutil attach $HOME/src-case.sparsebundle -mountpoint $HOME/src-case

1つ目でファイルシステムを作成し,二つ目で$HOME/src-caseにアタッチする.ct-ngのコマンドをこのsrc-caseの下で実行すれば先のエラーは突破するはずである.

Companion librariesのversion変更

私の環境では続いて,gettextのビルド時にlinker errorが発生した.原因はリンクのシンボル名の衝突. これはgettextのversionを落とすことで解決した.

ct-ng menuconfig

を実行し,config設定画面に入る.

Companion libraries > gettext > Version of gettext

とたどり,ここでversionを0.19.8.1にした.また,同じくncurseのversionも6.2へと変更した.

(断念箇所) Installing core C gcc compiler

libraryのversionを変更し,順調に進むかと思ったが,compilerのビルドで止まってしまった. 直接の原因は

[ERROR]    fatal error: too many errors emitted, stopping now [-ferror-limit=]

だが,logを見ると,

[ERROR]    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__locale:811:21: error: too many arguments provided to function-like macro invocation

[ERROR]    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__locale:806:2: error: expected ';' at end of declaration

などが多発していた.

ビルドに使用しているgccをclangのものではなくbrewで入れたgccに変更してみたりしたが,結果は変わらなかった. 正直ここでもう疲れたので,M1 MacBook AirでC言語のクロスコンパイル環境を構築することは断念した.

色々作業しGWの半分くらいは粘ったが,私の能力では解決できそうになかった. Windowsと比べればMacの方が楽という勝手な思い込みがあったが,クロスコンパイル構築という意味ではWindows+WSL2+Yoctoの方が圧倒的に簡単だった(こちらはAGLのイメージ作成手順に従っただけだが). もしかしたら,M1 MacでもAGLを仮想環境にすれば良かったのかもしれないが,もう気力が尽きてしまった.