タイトルの通りです。
RubyでFFIを利用してC言語のライブラリなどのバインディングを作成するときは、
- Rubyの標準ライブラリのFiddleを利用する方法
- Ruby-FFIを利用する方法
があります。その際に、プラットフォームごとに、共有ライブラリのファイルの拡張子が異なるため、case
文で分岐を作成する必要がありました。例えばこんな感じです。
case文による分岐
lib_name = case RbConfig::CONFIG['host_os']
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
'libssw.dll' # unconfirmed
when /darwin|mac os/
'libssw.dylib' # unconfirmed
else
'libssw.so'
end
RbConfig::CONFIG['host_os']
の代わりに RUBY_PLATFORM
を使ってもよいかもしれません。
FFI::Platform::LIBSUFFIX
Ruby-FFIを利用している場合は、FFI::Platform::LIBSUFFIX
で共有ライブラリの拡張子を取得できます。
require 'ffi'
p FFI::Platform::LIBSUFFIX
# dll : Windows
# dylib : macOS
# so : Ubuntu
RbConfig::CONFIG['SOEXT']
Fiddleを利用する場合は、RbConfig::CONFIG['SOEXT']
で共有ライブラリの拡張子を取得できます。これは Ruby 2.5以上が必要です。しかし、すでにRuby2.4はRubyの公式サポートから外れていますので、これから新規作成するライブラリでは気にせずに使ってよいと思います。
p RbConfig::CONFIG['SOEXT']
# dll : windows
# dylib : macOS
# so : Ubuntu
便利ですね。これを使えば、下記のようにすることで、不要なcase
分岐を回避できます。
lib_name = "libssw.#{RbConfig::CONFIG["SOEXT"]}"
この記事は以上です。