如果库可用,则为本机C扩展

时间:2011-06-25 21:04:56

标签: ruby-on-rails ruby ruby-c-extension

我正在构建一个本机C扩展Ruby gem,用于生成唯一标识符(找到here)。我希望库尽可能使用 libuuid (通过C扩展)并回归到简单的Ruby实现。我目前有用于生成UUID的C和Ruby代码,但是我无法弄清楚如何配置成功的回退。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

have_library方法有一个返回值:

  

返回是否可以在func中找到给定的入口点lib

所以你应该能够做到这一点:

$defs.push('-DUSE_RUBY_UUID') if !have_library('uuid')
create_makefile("identifier")

如果未定义USE_RUBY_UUID,则将C设置为使用 libuuid ,如果已定义,则调用Ruby UUID库。

奇怪的是,mkmf.rb中的have_headerhave_func方法为您添加了宏:

# File mkmf.rb, line 840
def have_header(header, preheaders = nil, &b)
  checking_for header do
    if try_header(cpp_include(preheaders)+cpp_include(header), &b)
      $defs.push(format("-DHAVE_%s", header.tr_cpp))
      true
    else
      false
    end
  end
end

have_library让你自己动手。