rbsecp256k1 gemについて調べてる (2)

前回の記事: 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/blob/456ea9fa4b7829f58f00cb5df99142f07da1cc3b/Makefile#L32-L33

コンパイルした

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さんありがとうございます!

プルリクエストを読んでみます(理解できるかな〜?)