[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

In This Thread

Prev Next