Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby 3.1.1: M1 Macbookにcapstoneがインストールされているとビルドできない

(この問題はRuby 3.1.3では解決済みです

🔗 セットアップ

  • Macbook Pro 2021(M1)
  • macOS Ventura 13.0.1
  • homebrew: 3.6.12
    • openssl@3/3.0.7
    • libyaml: stable 0.2.5 (bottled)
    • readline: stable 8.2.1 (bottled) [keg-only]
    • gmp: stable 6.2.1 (bottled), HEAD
  • CommandLineTools: 14.1.0.0.1.1666437224

直接関係なさそうですが、念のためBisonも3以上にアップデートしてあります↓。

Ruby 3.2 (dev) のビルドに Bison 3 以上が必要になる - koicの日記

# オプション
export RUBY_CONFIGURE_OPTS="--enable-shared --with-opt-dir="$(brew --prefix openssl):$(brew --prefix readline):$(brew --prefix libyaml)" --disable-install-doc --disable-install-rdoc"

🔗 問題

上のセットアップでrbenv install 3.1.1を実行すると以下のエラーが発生し、インストールできません。

$ rbenv install 3.1.1
To follow progress, use 'tail -f /var/folders/6_/412tm5md0svdq66fxwwgn0tw0000gn/T/ruby-build.20221122130714.68745.log' or pass --verbose
Downloading openssl-3.0.7.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e
Installing openssl-3.0.7...
Installed openssl-3.0.7 to /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.1

Downloading ruby-3.1.1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.1.tar.gz
Installing ruby-3.1.1...
ruby-build: using readline from homebrew
ruby-build: using gmp from homebrew

BUILD FAILED (macOS 13.0.1 using ruby-build 20221121)

Inspect or clean up the working tree at /var/folders/6_/412tm5md0svdq66fxwwgn0tw0000gn/T/ruby-build.20221122130714.68745.MwEkkb
Results logged to /var/folders/6_/412tm5md0svdq66fxwwgn0tw0000gn/T/ruby-build.20221122130714.68745.log

Last 10 log lines:
transdb.h updated
linking shared-library libruby.3.1.dylib
ld: library not found for -lcapstone
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libruby.3.1.dylib] Error 1
make: *** Waiting for unfinished jobs....
transform_mjit_header: making external definition static inline: rb_vm_lvar_exposed, Init_vm_stack_canary, rb_vm_opt_cfunc_p, rb_vm_opt_mod, rb_vm_ic_hit_p, rb_vm_splat_array, rb_vm_defined, rb_vm_cc_general, rb_aliased_callable_method_entry, rb_find_defined_class_by_owner, rb_vm_call_ivar_attrset_p, rb_iseq_only_kwparam_p, rb_iseq_only_optparam_p, rb_vm_set_ivar_idx, rb_vm_setinstancevariable, rb_vm_setclassvariable, rb_vm_getclassvariable, rb_vm_rewrite_cref, rb_vm_get_cref, rb_vm_block_ep_update, rb_vm_cref_new_toplevel, rb_vm_cref_dup_without_refinements, rb_vm_frame_block_handler, rb_vm_cframe_keyword_p, rb_vm_ep_local_ep
transform_mjit_header: making declaration static inline: rb_vm_lvar_exposed, rb_vm_lvar_exposed, Init_vm_stack_canary, rb_vm_rewrite_cref, rb_vm_frame_block_handler, rb_vm_block_ep_update, rb_vm_ep_local_ep
transform_mjit_header: SKIPPED to transform: __sigbits, isspecial, isrune, isphonogram, isnumber, isideogram, ishexnumber, digittoint, toupper, tolower, toascii, isxdigit, isupper, isspace, ispunct, isprint, islower, isgraph, isdigit, iscntrl, isblank, isalpha, isalnum, __wcwidth, __isctype, __istype, isascii, __sincospi, __sincospif, __sincos, __sincosf, __inline_isnormall, __inline_isnormald, __inline_isnormalf, __inline_signbitl, __inline_signbitd, __inline_signbitf, __inline_isnanl, __inline_isnand, __inline_isnanf, __inline_isinfl, __inline_isinfd, __inline_isinff, __inline_isfinitel, __inline_isfinited, __inline_isfinitef, __darwin_fd_clr, __darwin_fd_set, __darwin_fd_isset, __darwin_check_fd_set, __sputc
ln -sf ../../../.ext/include/arm64-darwin22/rb_mjit_min_header-3.1.1.h include/ruby-3.1.0/arm64-darwin22/rb_mjit_min_header-3.1.1.h

🔗 解決方法

参考: Failed to install ruby 3.1.0 on M1 · Discussion #1933 · rbenv/ruby-build
参考: Ruby 3.1+ installation fails when capstone is installed on M1 / macOS · Issue #5189 · rvm/rvm

上のissueに解決方法がありました。capstoneがHomebrewでインストールされていると失敗するのだそうです。

どうやらHomebrewでqemuをインストールしたときに一緒にcapstoneが入ってきたようです。

以下を実行してcapstoneとやらを削除します。bloatyがインストールされている場合はそれも削除します。

$ brew uninstall --ignore-dependencies capstone
$ rbenv install 3.1.1
To follow progress, use 'tail -f /var/folders/6_/412tm5md0svdq66fxwwgn0tw0000gn/T/ruby-build.20221122125704.52689.log' or pass --verbose
Downloading openssl-3.0.7.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e
Installing openssl-3.0.7...
Installed openssl-3.0.7 to /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.1

Downloading ruby-3.1.1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.1.tar.gz
Installing ruby-3.1.1...
ruby-build: using readline from homebrew
ruby-build: using gmp from homebrew
Installed ruby-3.1.1 to /Users/hachi8833/.anyenv/envs/rbenv/versions/3.1.1

成功しました。

🔗 おまけ

なお、Ruby 3.2.0-dev(master c8bfbbc25e)およびRuby 3.2.0rc1の場合は、capstoneとbloatyがインストールされていても問題なくビルドできました。

また、Ruby 3.1.3、3.0.5、2.7.7がリリースされたので3.1.3で試してみましたが、こちらもcapstoneとbloatyがインストールされていても問題なくビルドできました。

Ruby 3.1.3、3.0.5、2.7.7がリリースされました



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。