Actions
Bug #12379
closedmkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X)
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-05-14) [x86_64-darwin15]
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
Actions
Like0
Like0Like0