前回の記事: https://tanaken0515.hatenablog.com/entry/2022/12/30/180910
よくわからなくなってきた(自分が何を試したのかわからなくなってきた)ので、もう一度状況を整理するために書いています。
①まずは rbsecp256k1 gem のリポジトリをforkして、forkしたリポジトリをローカルにcloneした
% git clone git@github.com:tanaken0515/rbsecp256k1.git # ログは割愛 % cd rbsecp256k1 % git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
②Ruby 3.2.0 を入れて、RubyGemsのバージョンが3.4以上であることを確認した
% rbenv install 3.2.0 # ログは割愛 % rbenv local 3.2.0 # ログは割愛 % ruby -v ruby 3.2.0 (2022-12-25 revision a528908271) [arm64-darwin20] % gem -v 3.4.1
③rbsecp256k1 gemの利用に必要なライブラリを入れた
ref: https://github.com/etscrivner/rbsecp256k1#macos
% brew install automake openssl libtool pkg-config gmp libffi
④rbsecp256k1 gemの開発に必要なgemをインストールした
ref: https://github.com/etscrivner/rbsecp256k1#setup
% make setup
実態は bundle install
しているだけです
⑤コンパイルした
ref: https://github.com/etscrivner/rbsecp256k1#compiling-extension
% make build bundle exec rake compile cd tmp/arm64-darwin20/rbsecp256k1/3.2.0 /Users/kentarotanaka/.rbenv/versions/3.2.0/bin/ruby -I. -r.rake-compiler-siteconf.rb ../../../../ext/rbsecp256k1/extconf.rb Downloading libsecp256k1.zip Running 'chmod' for libsecp256k1 0.0.0... OK Running 'autogen' for libsecp256k1 0.0.0... OK Running 'configure' for libsecp256k1 0.0.0... OK Running 'compile' for libsecp256k1 0.0.0... OK Running 'install' for libsecp256k1 0.0.0... OK Activating libsecp256k1 0.0.0 (from ports/arm64-apple-darwin20.6.0/libsecp256k1/0.0.0)... checking for whether -I/Users/kentarotanaka/Documents/Repositories/github-com/rbsecp256k1/tmp/arm64-darwin20/rbsecp256k1/3.2.0/ports/arm64-apple-darwin20.6.0/libsecp256k1/0.0.0/include is accepted as CFLAGS... yes checking for whether -fPIC is accepted as CFLAGS... yes checking for whether -Wno-undef is accepted as CFLAGS... yes checking for whether -Wall is accepted as CFLAGS... yes checking for whether -Wl,--no-as-needed is accepted as LDFLAGS... no checking for -lsecp256k1... yes checking for -lgmp... no checking for secp256k1_recovery.h... yes checking for secp256k1_ecdh.h... yes creating Makefile cd - cd tmp/arm64-darwin20/rbsecp256k1/3.2.0 /usr/bin/make linking shared-object rbsecp256k1.bundle cd - /usr/bin/make install target_prefix= /usr/bin/install -c -m 0755 rbsecp256k1.bundle /Users/kentarotanaka/Documents/Repositories/github-com/rbsecp256k1/lib/rbsecp256k1 cp tmp/arm64-darwin20/rbsecp256k1/3.2.0/rbsecp256k1.bundle tmp/arm64-darwin20/stage/lib/rbsecp256k1/rbsecp256k1.bundle
⑥ローカル環境でrbsecp256k1 gemをビルドしてインストールした
% make install gem build rbsecp256k1.gemspec Successfully built RubyGem Name: rbsecp256k1 Version: 5.1.0 File: rbsecp256k1-5.1.0.gem gem install rbsecp256k1-*.gem Building native extensions. This could take a while... Successfully installed rbsecp256k1-5.1.0 Parsing documentation for rbsecp256k1-5.1.0 Done installing documentation for rbsecp256k1 after 1 seconds 1 gem installed
⑦ irb を起動して rbsecp256k1 を require すると LoadError が発生することを確認した
% irb irb(main):001:0> require 'rbsecp256k1' Ignoring debug-1.7.1 because its extensions are not built. Try: gem pristine debug --version 1.7.1 Ignoring rbs-2.8.2 because its extensions are not built. Try: gem pristine rbs --version 2.8.2 <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- rbsecp256k1/rbsecp256k1 (LoadError) from <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from /Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rbsecp256k1-5.1.0/lib/rbsecp256k1.rb:10:in `<top (required)>' from <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `require' from <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require' from <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:149:in `require' from (irb):1:in `<main>' from /Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>' from /Users/kentarotanaka/.rbenv/versions/3.2.0/bin/irb:25:in `load' from /Users/kentarotanaka/.rbenv/versions/3.2.0/bin/irb:25:in `<main>' <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- rbsecp256k1 (LoadError) from <internal:/Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from (irb):1:in `<main>' from /Users/kentarotanaka/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>' from /Users/kentarotanaka/.rbenv/versions/3.2.0/bin/irb:25:in `load' from /Users/kentarotanaka/.rbenv/versions/3.2.0/bin/irb:25:in `<main>'
⑧ gemspec の files
を書き換えてみた
前回の記事 https://tanaken0515.hatenablog.com/entry/2022/12/30/180910 で考えていた
diff --git a/rbsecp256k1.gemspec b/rbsecp256k1.gemspec index 6b8f86b..57300bc 100644 --- a/rbsecp256k1.gemspec +++ b/rbsecp256k1.gemspec @@ -14,6 +14,7 @@ Gem::Specification.new do |s| s.homepage = 'https://github.com/etscrivner/rbsecp256k1' s.files = ( + Dir['lib/rbsecp256k1/*'] + Dir['lib/**/**.rb'] + Dir['documentation/**.md'] + %w[ext/rbsecp256k1/rbsecp256k1.c ext/rbsecp256k1/extconf.rb Rakefile README.md]
⑨再度 rbsecp256k1 gem をビルドしてインストールした
% make install
# ログは⑥と同じなので割愛
⑩ irb を起動して rbsecp256k1 を require してもエラーが発生しないことを確認した
% irb irb(main):001:0> require 'rbsecp256k1' Ignoring debug-1.7.1 because its extensions are not built. Try: gem pristine debug --version 1.7.1 Ignoring rbs-2.8.2 because its extensions are not built. Try: gem pristine rbs --version 2.8.2 => true
⑪ Slack の ruby-jp ワークスペースで共有&相談した
rubygems チャンネルで「gemspec の files を書き直したらいけそうでした〜」的な感じで共有したら、hsbtさんより
や、C extension の場合はそこになくても https://github.com/etscrivner/rbsecp256k1/blob/81dcbc5033806625b934211eb4f7173710795bee/rbsecp256k1.gemspec#L23 で示したルール通りにビルドするんですよね
とフィードバックをもらいました。
⑫ rbsecp256k1 を利用しているプロジェクトで動作確認をした
rbsecp256k1 を利用しているプロジェクト(お仕事のリポジトリ)で、⑧の修正コミットが積まれた rbsecp256k1 を参照するように書き換えて動作確認をしてみたところ、LoadError が発生してしまいました。
つまり⑧の修正は解決策にはならない(問題は別にある)ということがわかりました。
⑬ 自分はなにもわかっていないということを認識した
ので、なにもわからん〜と言いながら https://guides.rubygems.org/gems-with-extensions/ を読んだりしています。
そして、とりあえず状況を整理するためにこの記事を書き始めたのでした。
引き続き調べてみますが、なんもわからんとなっているのでだれか助けて〜となっています。
とりあえず https://github.com/etscrivner/rbsecp256k1/issues にissueを立てようかしら。
などと言っていたら、2022/12/31 00:24(いまから約12時間前)に issue https://github.com/etscrivner/rbsecp256k1/issues/61 が立ってる!
そして 2022/12/31 05:37(いまから約7時間前)に https://github.com/etscrivner/rbsecp256k1/pull/66 で解決している...!!
最高じゃん! etscrivnerさんありがとうございます!
プルリクエストを読んでみます(理解できるかな〜?)