[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 <kimuraw@i.nifty.jp>:
>> 木村といいます。
>>
>> 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