Project

General

Profile

Actions

Bug #12379

closed

mkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X)

Added by kimuraw (Wataru Kimura) over 8 years ago. Updated over 8 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-05-14) [x86_64-darwin15]
[ruby-dev:49619]

Description

OS X 10.11.4上で

  • rubyが/opt/localにインストールされている
  • /opt/local/lib/libiconv.dylibがある

とき、gem ffiのインストールに失敗します。

% gem2.4 install --user-install ffi
  :
Building native extensions.  This could take a while...
ERROR:  Error installing ffi:
	ERROR: Failed to build gem native extension.
  
    current directory: /Volumes/CHome/kimuraw/.gem/ruby/2.4.0/gems/ffi-1.9.10/ext/ffi_c
/opt/local/bin/ruby2.4 -r ./siteconf20160514-49182-10gdli4.rb extconf.rb
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
  :
extconf failed, exit code 1

mkmf.logには

| pkg-config --libs libffi 
=> "dyld: Symbol not found: _iconv\n" 
=> "  Referenced from: /usr/lib/libcups.2.dylib\n" 
=> "  Expected in: /opt/local/lib/libiconv.2.dylib\n" 
=> " in /usr/lib/libcups.2.dylib\n" 

のようなエラーが記録されています。

調べてみたところ、mkmf.rbのpkg_config()で

  • pkg-config --existsはsystem()で環境変数の追加なしで呼び出し
  • pkg-config --libs等はxpopen()経由で環境変数を追加して呼び出し
    • この場合はDYLD_LIBRARY_PATH=.|/opt/localが指定されている。
    • pkg-configは間接的に/usr/lib/libiconvにリンクしているが、環境変数により/opt/localを優先しシンボルの解決に失敗する。
  • 上述の結果としてpkg-config --existsは成功するが、--libsや--cflagsはエラーになってしまう。

となっているようです。
少なくともpkg-configコマンドの呼び出し時のDYLD_LIBRARY_PATHの有無について
mkmf.rb内で統一すべきではないかと思います。
常に環境変数を渡すようにしたとしても、pkg-config以外の方法でlibffiを探すようになるので
extconf.rbは正常に実行できるようになります。

trunk(r54997)と2.3.1で起きることを確認しました。
2.2以前はどちらも環境変数なしでpkg-configを呼び出しているため、今回の問題は起きません。

エラーになったときのmkmf.logを添付します。


Files

mkmf.log (2.07 KB) mkmf.log error log from `gem install ffi` kimuraw (Wataru Kimura), 05/13/2016 04:41 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0