見出し画像

Ardour8をMacOSでビルドする(解決)

まず、試行錯誤したnoteを参照されたし

まず、Xcodeのコマンドラインツールを入れていない人は入れてください。which pythonが通らない人は次の手順も行ってください。
最近のmacではpythonというコマンドのパスを持たないためwafを実行するとno such file or directoryになります。これを解決するにはbrewでpython3をインストールしてbrew infoのパス/binにパスを設定してwhich pythonが通る状態にするか、同じくbrewでpyenvをインストールしてglobalにpyenvの環境を使うようにすればOKです。単純にシステムのPythonにシンボリックリンクを貼るとxcodeのコマンドラインツールを入れようとしてきました。謎です。

wafが実行できるようになったらbrew install pkg-configします。
次にbrewでインストールするパッケージを正しくwafが見つけられるようにPKG_CONFIG_PATHを設定します。zshrcに書いてもいいと思います。

$ export $PKG_CONFIG_PATH=/opt/homebrew/lib/pkgconfig

これを実行したあと、依存パッケージをhomebrewで順にインストールしていきます。パッケージ名とかはbrew searchでそれっぽいのが見つかると思いますのでbrewのホームページで詳細を確認してからインストールしてみてください。

brew install pkg-config 
brew install suil
brew install boost
brew install glib
brew install glibmm
brew install libsndfile
brew install libarchive
brew install liblo
brew install taglib
brew install vamp-plugin-sdk
brew install rubberband
brew install libusb
brew install jack
brew install fftw
brew install aubio
brew install libsigc++
brew install cppunit
brew install libwebsockets
brew install pangomm
brew install lrdf
brew install serd
brew install sord
brew install sratom
brew install lilv
brew install gtkmm

/opt/homebrew/lib/pkgconfig配下にあるglibmmとgiommとsigc++とpangommとcairommの.pcファイル名を完全一致するように修正する必要があるかもしれません。依存関係自体は上記のbrewコマンドで解決できるはずです。クリーンな環境だと.pcファイルが完全一致しないせいで設定が通らない可能性が高いため、その場合にはシンボリックリンクを完全一致で作成してあげると良いと思います。
次にzshrcを以下のように編集して読み込んでください。

export PKG_CONFIG_PATH=/opt/homebrew/lib/pkgconfig
export CPLUS_INCLUDE_PATH="/usr/local/include"
export CPLUS_INCLUDE_PATH="/opt/homebrew/include:$CPLUS_INCLUDE_PATH"
export PATH="/opt/homebrew/opt/libarchive/bin:$PATH"
export PKG_CONFIG_PATH="/opt/homebrew/opt/libarchive/lib/pkgconfig:$PKG_CONFIG_PATH"


依存関係を解決できたら次にやることがあります。それはソースの修正です。Ardourはパッチを当てたGTK+2を利用しており、標準のビルドオプションではリポジトリに内包しているGTK+をソースからビルドしようとします。ここでMacOS(というかclangか?)で使えないソースを書いているせいで(具体的には__attribute()のalias引数)ビルドが通りません。これを解決するにはビルド時に特定の引数を渡すらしいのですが、wafとかいう謎のビルドシステムを使っているせいで指定する方法がわかりませんでした。だれか解決する方法教えて…
このGTKを使わせないようにするには--no-ytkというオプションをつける必要があります。その場合、gtkmmをbrewでインストールしなければなりません。
これをインストールしてその他の依存関係もbrewで頑張って解決したのち以下のコマンドを実行するとビルドの設定が通ります。

$ CC=clang CXX=clang++ ./waf configure --arm64 --strict --ptformat --libjack=weak --prefix=~/Ardour --no-ytk --optimize

ただ、これだけではダメで、先述の通りGTKのパッチに対応したソースコードの修正を行う必要があります。でもまずはビルドを実行してみましょう。

実際に./wafでビルドを実行すると途中で

../libs/gtkmm2ext/nsglview.mm:46:2: error: NO TAG
#error NO TAG
 ^
1 error generated.

このようなエラーが出ると思います。これはnsglview.mmというファイルの以下の部分に該当しています。

#ifndef ARDOUR_CANVAS_NSVIEW_TAG
#error NO TAG
#define ARDOUR_CANVAS_NSVIEW_TAG 0x0
#endif


ChatGPTは神

これは、ARDOUR_CANVAS_NSVIEW_TAGが定義されていない場合NO TAGというエラーメッセージをコンパイラに渡してコンパイルを失敗させるという処理です。したがってARDOUR_CANVAS_NSVIEW_TAGが定義されていないためにこのエラーが出ていることがわかります。
VSCodeでリポジトリを開き、ARDOUR_CANVAS_NSVIEW_TAGを大文字小文字区別の完全一致で検索すると、gdk.hというファイルに以下の記述が見つかるはずです。

#ifdef __APPLE__
#define ARDOUR_CANVAS_NSVIEW_TAG 0xa2d0c2c4
#endif

#endif /* __GDK_H__ */

おそらくこれがGTKのパッチに該当するのでしょう。ここにはマジックナンバーが書かれているので、これを先程のコードに反映してあげればよいということになります。

/* the gtk-quartz library which ardour links against
 * is patched to pass events directly through to
 * NSView child-views (AU Plugin GUIs).
 *
 * In this particular case however we do want the
 * events to reach the GTK widget instead of the
 * NSView subview.
 *
 * If a NSVIew tag equals to the given magic-number,
 * Gdk events propagate.
 */
#define ARDOUR_CANVAS_NSVIEW_TAG 0xa2d0c2c4

この修正を行ったうえで再び./wafでビルドすると、依存関係がすべて解決できていればビルドが通るはずです。その後./waf installでprefix配下にインストールされます。アンインストールを楽にするためにデフォルトの/usr/local配下はやめておいたほうが良いと思います。

リポジトリには.appバンドルを作成するためのシェルスクリプトが同梱されているのですが、--no-ytkを指定したせいでno such file or directoryを起こすので使わないようにしました。シェルスクリプトのソースを修正すればたぶん.appにもできると思われますが、ardevのエイリアスを作ってそれをダブルクリックで起動するようにしたほうが楽だと思われます。.appを手動で構築するのはクソめんどくさいです。

追記: ./waf installしてもリポジトリ内のライブラリを参照しに行っており、リポジトリを消すと起動できなくなったため、./waf installせずにあらかじめインストールしたい場所にリポジトリをクローンしてビルドを行い、gtk2_ardour/ardevを起動するほうがよさそう。./waf installしてardour8-x.yを実行してみましたが、GTKのテーマが見つからないという警告が出ました。ardev経由での実行ではエラーが出なかったので、やはりインストールしないで実行するべきかもしれません。

ビルドしたArdour8

追記2: プラグインのGUIが機能しなくなっていた。おそらく先のソース変更によるものであると考えられるため、修正が必要である。


マウスのイベントに問題が生じるらしい

徹底的に調べたところ、次のようなことがわかりました。

  1. GTK+2にパッチを適用している。パッチはプロジェクトルート/tools/patchesの中に入っている

  2. GTK+2のソースコードがYTKという名前で格納されている。本来はmakeでビルドするものがwafでビルドするように構築されている。

  3. GTK+2はMac向けにビルドする場合適切な引数を与えないとエラーを起こす。(aliasが存在しないため)

以上の点を考慮すると、GTKのソースコードを引っ張ってきてpatchesの中にあるパッチを適用したうえでmakeでビルドしてすげ替え、オプションに--no-ytkを指定してビルドを行うことで正しくビルドを行えると考えられる。この場合先程の間違ったソース修正は不要となり、正しくマウスイベントが機能すると思われる。


パッチはytkモジュールに組み込まれているようだ

パッチはすでに組み込まれていることがわかった。オリジナルのGTK+で--disable-visibilityを指定したときに何が起きているのかを特定することができればそれをwscriptに反映して修正させることでビルドが通ると思われる。

追記3: --disable-visibilityを指定するとコンパイラのフラグに-DDISABLE_VISIBILITYが指定されることがわかった。これはマクロを定義するフラグであり、ソースファイルにある#ifndef DISABLE_VISIBILITYなどがこのフラグに対応している。DISABLE_VISIBILITYが指定されていない場合にaliasを利用したコードがコンパイルされるらしい。そしてそれはMacではコンパイルできない、ということのようだ。
したがって、wscriptを修正してプラットフォームがMacのときはこのフラグを定義するようにすればよいということまでわかった。

結論:以下のように編集してコンパイラフラグを定義してあげれば完璧にビルドが通った。


プルリクエスト送ってみた

これにて戦いは終わった。

この記事が気に入ったらサポートをしてみませんか?