[ruby-dev:49620] [Ruby trunk Bug#12379] mkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X)
From:
nagachika00@...
Date:
2016-05-14 17:47:00 UTC
List:
ruby-dev #49620
Issue #12379 has been updated by Tomoyuki Chikanaga.
Backport changed from 2.1: DONTNEED, 2.2: DONTNEED, 2.3: REQUIRED to 2.1: DONTNEED, 2.2: DONTNEED, 2.3: DONE
ruby_2_3 r55001 merged revision(s) 54999.
----------------------------------------
Bug #12379: mkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X)
https://bugs.ruby-lang.org/issues/12379#change-58620
* Author: Wataru Kimura
* Status: Closed
* Priority: Normal
* Assignee:
* ruby -v: ruby 2.4.0dev (2016-05-14) [x86_64-darwin15]
* Backport: 2.1: DONTNEED, 2.2: DONTNEED, 2.3: DONE
----------------------------------------
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)
--
https://bugs.ruby-lang.org/