2011-06-25 41 views
4

我正在構建本地C擴展Ruby gem以生成唯一標識符(找到here)。如果可能的話,我希望圖書館使用libuuid(通過C擴展)並回退到簡單的Ruby實現。我目前有用於生成UUID的C和Ruby代碼,但我無法弄清楚如何配置成功的回退。有任何想法嗎?本地C擴展(如果庫可用)

+0

通常開發者所做的是提供一個純粹的和非純粹的gem版本。 –

+0

@Pablo如在兩個單獨的版本的寶石? –

+0

我這麼認爲,至少'json' gem有一個'json_pure'版本。 –

回答

3

have_library方法有返回值:

返回是否給定的切入點func可以在lib被發現。

所以,你應該能夠做到這一點:

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

然後設置你的C使用libuuid如果沒有定義USE_RUBY_UUID和調入Ruby的UUID庫,如果它被定義。

奇怪的是,have_headerhave_func方法mkmf.rb添加宏爲您提供:

# 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讓你自己做。

+0

我會首先在ruby中定義所有的方法。然後需要C擴展。如果找到該庫,請覆蓋一些ruby方法。如果找不到,什麼都不要做。 –

+0

@David:這取決於他現有的C如何設置。完全繞過Ruby並直接進入C庫會比通過Ruby的方法解析和編組/解組系統繞行要快得多,可能要方便得多。 –