[ruby-dev:50259] Re: [質問]ruby-2.4.xのlibrubyファイル名
From:
kimura wataru <kimuraw@...>
Date:
2017-09-22 12:31:23 UTC
List:
ruby-dev #50259
On Fri, 22 Sep 2017 19:21:02 +0900, NARUSE, Yui wrote: > r56905 による変更ですが、意図的なものでしょう。 > > この類のバージョンには普通のバージョンと互換バージョンとがあり、 > 共有ライブラリのバージョンは普通のバージョンであるべきです。 > なぜなら、互換バージョンを指定して使いたい場合には libruby.2.4.dylib > や libruby.dylib があるのですから。 > > 2017年9月19日 22:21 kimura wataru <[email protected]>: >> 木村といいます。 >> >> librubyのファイル名について質問させてください。 >> macOSでrubyを使っていますが、2.4から >> >> libruby.2.4.2.dylib >> ^ >> など、TEENYがついたファイル名になっています。 >> ありがとうございます。ファイル名に実際のTEENYが反映されるのは 意図された変更ということですね。 拡張ライブラリで問題が起きるケースがありました。 bugs.ruby-lang.orgに登録したほうがよければそうします。 以下再現手順です。 1. ruby 2.4.1を用意 $ cd ruby-2.4.1 $ ./configure --enable-shared --prefix=~/tmp_ruby/ruby24 --disable-install-doc $ make && make install # インストールしたrubyにパスを通す $ export PATH=~/tmp_ruby/ruby24/bin:$PATH $ which ruby gem /Users/kimuraw/tmp_ruby/ruby24/bin/ruby /Users/kimuraw/tmp_ruby/ruby24/bin/gem 2. 拡張ライブラリのあるgemをインストール $ gem install psych 3. ruby 2.4.2で2.4.1を上書き $ cd ../ruby-2.4.2 $ ./configure --enable-shared --prefix=~/tmp_ruby/ruby24 --disable-install-doc $ make && make install 4. 2.でインストールした拡張ライブラリをロードするとエラーになる $ gem list /Users/kimuraw/tmp_ruby/ruby24/lib/ruby/2.4.0/yaml.rb:5:in `<top (required)>': It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby. /Users/kimuraw/tmp_ruby/ruby24/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': incompatible library version - /Users/kimuraw/tmp_ruby/ruby24/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle (LoadError) from /Users/kimuraw/tmp_ruby/ruby24/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require' : この例では上書きですが、homebrewやmacportsなどのパッケージで rubyを入れている場合はlibruby.2.4.1.dylibが見つからない (image not found)とのエラーになります。 homebrewのissueに類似の事例が上がっています。 https://github.com/Homebrew/homebrew-core/issues/18123 https://github.com/Homebrew/homebrew-core/issues/11636 対策としては、librubyのinstall_name(linuxのsonameみたいの)に TEENYを含めないことでしょうか。 trunkで試してみたところ、DLDFLAGSの-install_nameオプションを 変更すれば解決できそうです。 $ otool -D libruby.2.5.0.dylib libruby.2.5.0.dylib: /Users/kimuraw/tmp_ruby/ruby25/lib/libruby.2.5.dylib $ otool -L .ext/x86_64-darwin16/fiddle.bundle .ext/x86_64-darwin16/fiddle.bundle: /Users/kimuraw/tmp_ruby/ruby25/lib/libruby.2.5.dylib (compatibility version 2.5.0, current version 2.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2) /opt/local/lib/libffi.6.dylib (compatibility version 7.0.0, current version 7.4.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) Makefileの変更。 --- Makefile.orig 2017-09-22 21:04:38.000000000 +0900 +++ Makefile 2017-09-22 21:12:28.000000000 +0900 @@ -80,7 +80,7 @@ MISSING = ${LIBOBJDIR}explicit_bzero.o ${LIBOBJDIR}setproctitle.o ENABLE_SHARED = yes LDSHARED = $(CC) -dynamiclib -DLDFLAGS = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -install_name $(libdir)/$(LIBRUBY_SO) -compatibility_version $(MAJOR).$(MINOR) -current_version $(RUBY_PROGRAM_VERSION) $(XLDFLAGS) $(XLDFLAGS) $(ARCH_FLAG) +DLDFLAGS = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -install_name $(libdir)/lib$(RUBY_BASE_NAME).$(MAJOR).$(MINOR).dylib -compatibility_version $(MAJOR).$(MINOR) -current_version $(RUBY_PROGRAM_VERSION) $(XLDFLAGS) $(XLDFLAGS) $(ARCH_FLAG) SOLIBS = $(LIBS) ENABLE_DEBUG_ENV = MAINLIBS = -- kimura wataru