MoltenVK を試してみる

MacOS では将来的には OpenGL は廃止になる。

アップル公式的には、Metal を使えということになっているのだが、いやー、これがとっつきにくい。

Metal に被せる形にはなるのだが、Vulkan という仕様がある。

Vulkan の MacOS 向けの実装が MoltenVK で、GitHub にも公式リポジトリがあり、誰でも利用可能だ。

自分でビルドする必要があるが、大して難しくない。

MoltenVK のビルド

必要なのは cmake と python3 。

リポジトリからソースを取ってきた後、フォルダに移動して

./fetchDependencies --macos

を実行するのみ(iOS で使いたい人は –ios などとする)。

これで、Package/Release/MoltenVK に MoltenVK.xcframework ができている。

不幸にも

tool ‘xcodebuild’ requires Xcode, but active developer directory ‘/Library/Developer/CommandLineTools’ is a command line tools instance

のエラーが出た人は、ここらあたりを参照して直しておきましょう。

デモの実行

デモも用意されている。

実行すると

というウィンドウが表示されます。

ライブラリなどの構築

フレームワークがあるので、必ずしも必要ではないが、静的・動的ライブラリをアプリに組み込んで使いたい人は、.dylib や .a ファイルを作成する手段がいくつか提供されている。

わかりやすいのは、Xcode を使う方法でしょうか。

落としたてきたフォルダの中にMoltenPackaging.xcodeproj があるので、これを Xcode で開く。

プラットフォーム毎にターゲットが用意されているので、欲しいプラットフォームのターゲットを選び、ビルドする。

そんなに時間もかからず、ビルドは完了する。

まあ、現時点ではそんなに使う機会もないかな。

なお、公式のプログラミングガイダンスはこちら

けっこう、えぐい。

 

シェル芸

MacOS/iOS プロジェクトが初学者にとってとっつきにくい理由の一つは、突如としてシェルスクリプトの知識が要求されることではないだろうか?

アプリにしてもライブラリにしてもユニバーサルファイルを自動で生成してくれる機能はなく、arm64 向けにビルドしたものと x86_64 向けにビルドしたものを lipo コマンドで自分で一つにする必要がある。
この時、大抵の場合、「このシェルスクリプトを使え」みたいな案内があるが、初学者がその内容を把握できるとは思えない。

ここら辺までやるなら、いわゆるシェル芸の習得に時間を割いた方がいいと思う。

で、シェル芸なんだが、まとまった教科書なんてないでしょ?

まあ、教科書で覚えるもんでもないか。
わからなくなったら、その都度、検索かなあ。

ところで、シェルスクリプを書くにあたって、まず押さえておきたいシェルコマンドは、set かなあ。

書きたいシェルスクリプトの冒頭を

#!/bin/sh

set -e
set -o xtrace

としておけば、エラーで中断・内容を出力してくれるので、便利です。
どうせ、一発で動くことなんてほぼないんで(笑)

 

 

arm Mac で C/C++ ライブラリを x86_64 向けにビルドする

すっかり arm 環境に移行した感のある Mac 界隈だが、なんらかの事情で Intel Mac 向けにアプリなどをビルドしたいという場合がある(案件だとね)。

アプリ自体は Xcode 上での操作でなんとかなると思うのだが、厄介なのはライブラリの類。

使いたい C/C++ のライブラリを M1/M2 Mac 上で x86_64 向けにビルドする必要が出てくる。
いわゆるクロスコンパイルというやつだ。

iOS の場合、simulator が x86_64 でしか動かないので、この手の情報はけっこうあったのだが、 MacOS 向けの情報は皆無だった。

試行錯誤したところ configure 時に以下のようなにコンパイルオプションを与えると、クロスコンパイルできるようだ。

./configure --prefix=/dir/hoge x86_64-apple-darwin64 CFLAGS='-arch x86_64 -O2 -g'

あとは make, make install でいけるっぽい。

–build オプションを使えとか、それっぽい情報はあるにはあった。
が、実行しても惜しいところまではいくんだが、なぜか最終的にはうまくいかなかった。