MacでArdourをビルドして無料で使いたい
ArdourというオープンソースのDAWソフトウェアがあり、多機能で良さそうなのだがビルド済みのバイナリは有料だったため、ソースからビルドすることでタダで使おうという魂胆である。
Ardourのホームページには以下のような記述がある。
要約すると、brewで依存解決できると思った?ざんねんでした〜〜〜〜〜〜wwwwwwwwwwwwwwということが書いてある。アホくさ。
でも諦められない。
とりあえずビルドプロセスをたどってみると、ビルドはプロジェクトのルートにあるwafという実行ファイルで行うことがわかった。(実体はpythonスクリプトと、waflibというpythonスクリプトをバイナリとしてまとめたもの。隠しディレクトリを参照することでwaflibの中身を見られる。)そこで依存関係をチェックしているらしい。まずは./waf configureを実行して出力を確認した。するとgccにパスが通っているのにgccがないというエラーが出たため軽く調査すると、macにデフォルトで通っているgcc(/usr/bin/gcc)は自分のことをgccだと思いこんでいる精神異常clangであることが判明した。したがってbrewでgccをインストールして、brew infoでパスを確認した後aliasを張った。するとうまくいった。まずは一歩前進だ。
次にboostがないというエラーが出ていたためbrewでboostをインストールして
--boost-include=/opt/homebrew/Cellar/boost/1.84.0/include/
をコマンドライン引数に追加するとyesになって通った。boostはコマンドライン引数として指定が可能だったが、その他のライブラリは直接パスを指定するオプションが見当たらなかったためソースを読むことにした。以下備忘録。
wafはその実行ファイルにバイナリ(waflib)がパッキングされているためテキストエディタでは中身を見れない。したがってソースを読まなければならない。展開されていたwaflibから以下のautowaf関数をまず探し、そこからさらにスクリーンショットに添付したソース(check_cfg関数)というようにたどっていったところロジックを発見できた。
https://github.com/drobilla/autowaf/blob/master/extras/autowaf.py#L207
wafの公式ドキュメントとソース:
https://waf.io/apidocs/tools/c_config.html?highlight=check_cfg
https://waf.io/apidocs/_modules/waflib/Tools/c_config.html#check_cfg
これを参照するとどうやらcheck_cfgはpkg-configなどを利用している模様。これを読み解いて環境を整えなければならないようだ。
pkgconfigで検索したところ以上の関数がヒットした。self.env.PKGCONFIGが設定できればよさそうだということが判明した。
そこで環境変数PKGCONFIGにpkg-configのパスを指定してみたが、依然としてうまくいかなかった。
ログを確認すると、boost/version.hpp: No such file or directoryと出ていたため単純に環境変数の間違いである可能性が高かったため、
export CPLUS_INCLUDE_PATH=/opt/homebrew/include
してから./waf configureを実行したところbrewのパッケージを正しく探しに行くようになった。
その後、同じように進めていくとpkg-configが完全一致でパッケージを探しに行くことが判明した。本当はバージョンが下限よりも上であれば通るはずなのだがbrewで入れたパッケージではなぜかうまくいかなかった。
これを解決するには今のところwscriptを変更して.pcファイルのバージョンに対応した値に書き換えるとよいことが判明した。しかしwscriptに記述がないのにチェックが行われているものが多々あり(おそらくパッキングされている部分)、詰んでしまったため根本解決を目指した。
まず、wafをアンパックしてソースを明らかにしなければならない。ChatGPTに聞いたところ
./waf --help
でヘルプメッセージが出ると同時にドットディレクトリに展開されるらしい。実行するとたしかにwaflibが出てきた。この中身から原因を探るしかない。
import os
import sys
import re
def find_and_replace_wscript_files(search_root, old_string, new_string):
for root, dirs, files in os.walk(search_root):
for file in files:
if file == "wscript":
full_path = os.path.join(root, file)
with open(full_path, "r", encoding="utf-8") as f:
lines = f.readlines()
with open(full_path, "w", encoding="utf-8") as f:
for lineno, line in enumerate(lines, 1):
if "autowaf.check_pkg(" in line:
match = re.search(r'autowaf.check_pkg\([^,]+,\s*["\']([^"\']+)["\']', line)
if match and match.group(1) == old_string:
line = line.replace(old_string, new_string)
print(f"File: {full_path} - Line: {lineno}")
f.write(line)
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python script.py <old_string> <new_string>")
sys.exit(1)
old_string = sys.argv[1]
new_string = sys.argv[2]
search_root = os.getcwd() # カレントディレクトリ
find_and_replace_wscript_files(search_root, old_string, new_string)
パッケージ名を置換するためのスクリプトを書いて、これを逐次実行していくことで愚直に解決することにした。具体的にbrewで入れたパッケージ名がそのまま通用しなかったものは
glibmm
giomm
cairomm
pangomm
であった。これらはバージョン違いであった。
これらのパッケージを置換したあと、./waf configureをすると設定が通ったが、ビルドが失敗した。ログを読むとどうやらglibmmやgiommに警告が出ていたため、公式の指示どおりにglibmm-2.56をmakeでビルドしてsudo make install、置き換えたパッケージ名を元に戻して再びビルドを実行した。すると今度は少し進んでストップした。方向性はうまくいっているようだ。
brew uninstall pangomm
してから
brew install pangomm@2.46
してpangomm-1.4.pcがあることを確認したためこれも戻したところビルドがさらに進んだ。
しかし、やはりgtkに関連するエラー(主にmacでalias?がサポートされていないことによる)が出ているためhelpで確認して
--no-ytk Use system-wide GTK instead of Ardour YTK
以下のコマンドに変更した
./waf configure --arm64 --ptformat --libjack=weak --optimize --jobs=8 --no-ytk
no-ytkを指定すると依存関係が変わったため
brew install gtkmm
した。
最終的には以下のヘルプの通りにnsglview.mmの46行目
https://discourse.ardour.org/t/libgtkmm2-fails-when-attempting-a-build/108367/4
#error NO TAGをコメントアウトしたところビルドが成功した。
cd tools/osx_packaging ./osx_build --public
でdmgファイルができた。しかし、やはりどこかを失敗しているようで起動ができなかった。(追記: GTKを動的リンクするオプションっぽい?システムにGTKがインストールされてないと失敗する?)