2009-08-22 25 views
9

我在這找不到很多文檔。如何打包gem,以便在安裝gem時編譯C擴展?如何在Ruby Gem中包裝Ruby C擴展?

我特別想這樣做:

  • 在Linux和MacOSX上我想編譯創業板C擴展在Windows上安裝

  • 我想簡單地安裝一個預編譯的.so

有這方面的幫助,特別是例如源,將是非常有用的:)

回答

14

Luis Lavena創建了rake-compiler只是爲了這個目的。

但是,你確定你需要一個C擴展?關於C擴展的一點是,每個Ruby實現都有自己的C擴展API(和基於非C的類似,比如XRuby,JRuby,Ruby.NET,IronRuby,HotRuby,MagLev,Red Sun根本就沒有)意味着你的C分機只能在一個的實施中工作。而且,由於MRI 只有實現了Ruby 1.8和YARV 只有實現了Ruby 1.9,而且我們目前處於1.8和1.9之間的轉換階段,很可能很多人至少會使用兩種不同的實現。 (我個人使用5:MRI,YARV,JRuby,IronRuby和Rubinius。)

也許你最好用Ruby-FFI。 Ruby-FFI是Ruby的FFI(外部函數接口)(duh),它允許您以可在Ruby實現中移植的方式綁定並映射純Ruby中的C庫。 FFI API首先由Evan Phoenix開發,作爲Rubinius的原生擴展API,然後由Charles Oliver Nutter(並且由Wayne Meissner實施)爲JRuby採用。 Wayne然後還寫了Ruby-FFI gem,其中包含C擴展MRI和YARV。 Laurent Sansonetti實施Ruby-FFI爲MacRuby,Marc-André Cournoyertinyrbsupports FFI(再次由Wayne Meissner寫)和​​開發人員也在努力。這意味着,如果您可以使用FFI而不是C擴展來使您的庫工作,那麼您將自動支持6個Ruby實現,而不僅僅是一個。

使用C擴展而不是FFI擴展的唯一原因是,如果您確實想要需要某些實現特定的行爲。其中一個例子就是ParseTree寶石,該寶石深入到MRI的腸內,並撕掉分析樹的內存中表示。

最後但並非最不重要的,看看Nice-FFI項目John Croisant,其目的是使使用Ruby-FFI甚至更​​好。

+0

哇,看起來不錯!謝謝:) – horseyguy 2009-08-23 03:12:41

+0

不客氣!順便說一下,這就是完全的自我主義:我在Windows上使用Ruby,所以擴展作者越多使用rake-compiler,Windows就會發布更多的擴展! (但看到我的編輯。) – 2009-08-23 09:23:26

+0

看起來像這個答案是從'09,一些答案需要更新 – Tilo 2013-05-13 19:28:32

0

我有一個github回購,我維護只是爲了我自己的參考,這些東西幫助了我。

Ruby_C_extensions

它可以幫助環顧四周GitHub上找到已經只爲你的學習書面寶石的一些很好的例子,但繼續和克隆它們,看看你是否可以在系統上建立他們。如果他們被放在一起他們應該建立得很好。

請注意,您在任何使用的平臺上確實需要一些構建工具。這裏是我剛纔看到的一個視頻,告訴你你需要什麼Linux。

Python Programming Environment Setup

現在我知道了,它說的Python,他不告訴你如何安裝構建工具包。

我使用DevKit for Windows,它適用於我。隨着任何工具的安裝是最重要的。

我也使用rake編譯器和鋤頭來設置文件夾結構。所以看起來我們不得不靠耙子和鋤頭來傾斜一些園藝。 :-D