複天一流:どんな手を使ってでも問題解決を図るブログ

宮本武蔵の五輪書の教えに従い、どんな手を使ってでも問題解決を図るブログです(特に、科学、数学、工学の問題についてですが)

Apple M1-macbook proでcrispy-doomをコンパイルする:Rosettaの限界

intel-macからM1-macへの引っ越しは終了

intel-macbook(Mojave)からM1-macbook(Monterey)へ、仕事用のファイルの転送やメールの設定なども終わり、これでひととおりシステム移行は終了である。なんとか問題なくこれまでは来ている。

そこでcrispy-doomコンパイルしてみることにした。

crispy-doomをM1-macbookコンパイル

引越しの際、githubからダウンロードしたcrispy-doomのソースファイルもM1-macbookに転送した。

Rosettaがあれば、Intel x86-64のバイナリコードもM1-macbookで動かせるのだろう」と思ったのだが、そうは問屋が下さなかった。

まずひっかかったのが、homebrewのファイル構成の変更である。最新のhomebrewと10年前のhomebrewとでは、ディレクトリ構造が異なっていても不思議ではない。たとえば、libSD2-2.0.0.dylibの位置が、Intel-macのMojaveでは/usr/local/opt/sdl2/lib/に置かれていたのだが、M1-macのMontereyでは、/opt/homebrew/libに置かれている。この程度の差異なら、リンクを貼り直すことでなんとかなるので、

sudo mkdir /usr/local/opt
sudo mkdir /usr/local/opt/sdl2
sudo ln -s /opt/homebrew/lib /usr/local/opt/sdl2/lib

として再度起動してみた。すると今度は次のエラーである。

dyld[15015]: Library not loaded: /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib
....
Reason: tried: '/usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')

さっきhomebrewを使ってインストールしたばかりのSDL2のライブラリは、当然ながらarm64のバイナリファイルである。それをintel-macコンパイルしたx86_64のcrispy-doomは利用できないのは、普通に考えれば「当然」であるが、このM1-macbookマシンには「天下のRosetta」がインストールされているのではなかったか?!「こういう不一致を解析して、intel-macのバイナリファイルも動かしてしまうのがRosettaの役割じゃなかったのか?」と詰問したくなるが、そんな独り言を言っても無駄である。要は、自分でコンパイルしたバイナリファイルについては、Rosettaは動作を保証してくれないのである。(intel-macからもってきたatomエディターがRosettaを用いてM1-macで動いたのは、ライブラリの部分も一切合切、atomの実行ファイルの中にまとめてあるからなんだろうか?)

ということで、単なるディレクトリ構造の違いだけでは済まない、大きな壁があることが、crispy-doomコンパイルを通じて初めて体験できた。これはこれで大きな収穫だ。

M1-chipでARM64コードにコンパイルし直す

そこで、make cleanして、最初からM1-macbookコンパイルし直すことにした。sdl2に関する幾つかのファイルをインストールし忘れていたので、brew search sdl*を使ってリストアップし、端からインストールした。

% brew search sdl2
==> Formulae
sdl2 ✔              sdl2_image ✔        sdl2_net ✔          sdl2_ttf ✔
sdl2_gfx            sdl2_mixer ✔        sdl2_sound ✔

sdl2_gfxはグラフィックス処理関係の関数がまとめてあるライブラリだと思うが、crispy-doomでは使ってないようだ(インストールしてないのは気まぐれ)。

makeを繰り返すと、libsamplerateがない、という苦情がきたのでbrew install libsamplerateでインストールする。そういえば、makeもintel-mac用に生成されたものである。autogen.shを起動してMakefileを作り直した。再再度makeする。

今度はpython3のバイナリがx86_64になっていて動かない、という苦情がくる。よくよくみると、venvとしてローカルにインストールしたpython3がシステム移行の際に$HOME/binに紛れ込んでいたのが原因であった。このファイルを消去し、/opt/homebrew/bin/python3を使ってインストールさせる。このpython3は紛れもなくARM64のバイナリファイルである。

ということで、この後のmakeが最後となって、やっとのことでcrispy-doom (arm64版)が完成したのである!

しかし、crispy-doomとコマンドを打ったとき、最後の最後でまたもやerrorが発生した。一瞬愕然としたが、エラーメッセージを読んで苦笑した。wadファイルが指定されてない、というのである。wadファイルはディレクトリの上の階層に置いてあったので、crispy-doom -iwad ../doom1.wadと打つと見事にDOOMが起動したのであった!