Alchemusica を Intel/Arm の Universal Binary にすることを検討しています。Apple はすでに1年前に、Intel Mac で動作するのは macOS 26 (Tahoe) が最後であると発表しています。また、Apple Silicon Mac で Intel アプリを動作させる Rosetta 2 も段階的に廃止する予定とのことです。DTM をやっている人は Intel アプリが動く環境を確保し続けるでしょうけど(アップデートの見込みのないプラグインでも使いたいケースがありますよね?)、シーケンサが対応してない、というのはちょっとイマイチです。
私自身はプライベートでは Intel Mac しか使ってないので何も困ってないし、Arm 版を作っても自分で動作確認ができないこともあって、これまで Intel 版しか作っていませんでした。しかし、Intel 時代の終わりが近づいているので、いつまでも放置しているわけにもいかないかな、と思い、Arm 版の製作を始めました。
Objective-C で書かれた本体は、特に手を入れなくてもそのまま動きます。問題は、Ruby とのリンクです。Ruby 2.0.0 のスタティックライブラリを Universal Binary で作らないといけません。かなり手こずりました。
トライしている人を発見。「(できてない)」というのが気にはなりますが……
blog.dnpp.org
M1 Mac で Universal Binary な Ruby をビルドしたい (できてない)。
macOS Big Sur 11.5.2 時点ではシステムに標準で ruby 2.6.3p62 が入っており、ちゃんとユニバーサルバイナリとなっている。使うかどうかはさておき、自分でもユニバーサルバイナリな ruby をビルドしてみたい!
configure に --enable-multiarch と --with-arch=x86_64,arm64 を渡せばよいらしい。やってみましたが、ダメでした。
Invalid configuration `arm64-darwin21.6.0': machine `arm64' not recognized
'arm64' を認識できない、と言っています。まあそりゃそうだろうな。Ruby 2.0.0 って 2013 年リリースだもんな。
Ruby 2 系の最終リリースである Ruby 2.7.8 で試してみたところ、この2つのオプションで Universal Binary が作れました。Alchemusica の組み込み Ruby のバージョンはなるべく変えたくないので、2つのバージョンの configure, config.guess, config.sub あたりを見比べつつ、Ruby 2.0.0 の configure に修正を加えます。
#ifdef __ppc64__
"processor-name=powerpc64"
#endif
+#if defined(__arm64) || defined(__aarch64__)
+"processor-name=arm64"
+#endif
EOF
config.guess, config.sub は GNU の配布サイトから取得することにしました。
$ curl -L -o tool/config.sub https://git.savannah.gnu.org/cgit/config.git/plain/config.sub || exit 1
$ curl -L -o tool/config.guess https://git.savannah.gnu.org/cgit/config.git/plain/config.guess || exit 1
再挑戦。
$ CFLAGS='-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=10.9 -O2' ./configure --prefix=$PWD/build-osx-ub --enable-multiarch --with-arch=x86_64,arm64 --disable-shared --with-ext=date --disable-install-doc --with-static-linked-ext | tee configure.log
$ make V=1 2>&1 | tee make.log
通ったように見えたのですが、最後のあたりに変な warning が出ています。
ld: warning: ignoring file ext/date/date_core.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x64 0x61 0x74 0x65 0x5F 0x70 0x61 0x72 )
ld: warning: ignoring file ext/date/date_core.a, building for macOS-arm64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x64 0x61 0x74 0x65 0x5F 0x70 0x61 0x72 )
この warning はどうもまずそうな気がする。いろいろ調べてみました。make.log を確認したところ、この ext/date/date_core.a というライブラリファイルは、下のコマンドで生成されています。
ar cru date_core.a date_parse.o date_strptime.o date_core.o date_strftime.o
一方、正常にビルドできた Ruby 2.7.8 のログを見ると、この部分はこうなっていました。
libtool -static -no_warning_for_no_symbols -o date_core.a date_core.o date_parse.o date_strftime.o date_strptime.o
configure の時に、環境変数で AR と ARFLAGS を渡せばよさそうです。実は configure で ARFLAGS が使われておらず、cru という値がハードコーディングされていたため、いろいろ修正が必要でした。
--- ../ruby-2.0.0-p353_orig/configure 2013-11-22 13:23:39.000000000 +0900
+++ configure 2026-05-23 15:15:42.000000000 +0900
@@ -770,6 +770,7 @@ OBJDUMP
ASFLAGS
AS
AR
+ARFLAGS
RANLIB
try_header
COUTFLAG
@@ -5554,6 +5558,8 @@ test -n "$AR" || AR="ar"
fi
+ARFLAGS=${ARFLAGS:=rcu }
+
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
--- ../ruby-2.0.0-p353_orig/Makefile.in 2013-11-12 23:31:59.000000000 +0900
+++ Makefile.in 2026-05-22 23:08:29.000000000 +0900
@@ -145,7 +145,7 @@ RMDIRS = @RMDIRS@
RMALL = @RMALL@
NM = @NM@
AR = @AR@
-ARFLAGS = rcu
+ARFLAGS = @ARFLAGS@
RANLIB = @RANLIB@
AS = @AS@
ASFLAGS = @ASFLAGS@ $(INCFLAGS)
やってみました。
$ AR='libtool -static' ARFLAGS='-no_warning_for_no_symbols -o ' RANLIB=':' CFLAGS='-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=10.9 -O2' ./configure --prefix=$PWD/build-osx-ub --enable-multiarch --with-arch=x86_64,arm64 --disable-shared --with-ext=date --disable-install-doc --with-static-linked-ext | tee configure.log
$ make V=1 2>&1 | tee make.log
$ make V=1 install 2>&1 | tee install.log
$ cp enc/*.a build-osx-ub/lib # We need this for encoding support
無事成功しました。ちゃんと Universal Binary の静的ライブラリができています。
$ (cd build-osx-ub/lib; lipo -info *.a)
Architectures in the fat file: libenc.a are: x86_64 arm64
Architectures in the fat file: libruby-static.a are: x86_64 arm64
Architectures in the fat file: libtrans.a are: x86_64 arm64
Universal Binary 版の Alchemusica もビルドできました!
現状、私は arm64 版 Alchemusica の動作確認ができません。Alchemusica のページにプレビュービルドを置いて、動作確認報告を募集中です。誰も反応してくれてませんが、気長に待ちます(苦笑)。