From: kimuraw@... Date: 2016-05-13T17:15:47+00:00 Subject: [ruby-dev:49619] [Ruby trunk Bug#12379] mkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X) Issue #12379 has been reported by Wataru Kimura. ---------------------------------------- Bug #12379: mkmf.rb `pkg-config --exists`と`pkg-config --libs`の呼び出し方法が異なり期待した結果にならない(OS X) https://bugs.ruby-lang.org/issues/12379 * Author: Wataru Kimura * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.4.0dev (2016-05-14) [x86_64-darwin15] * Backport: 2.1: DONTNEED, 2.2: DONTNEED, 2.3: REQUIRED ---------------------------------------- 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/