如何在Ruby Gem中包装Ruby C扩展?

hor*_*guy 10 ruby rubygems

我在这方面找不到很多文档.如何打包gem以便在安装gem时编译C扩展?

特别是我想这样做:

  • 在Linux和MacOSX上我想在gem install上编译C扩展

  • 在Windows上我想简单地安装一个预编译的.so

对此的任何帮助,特别是示例源,将非常有用:)

Jör*_*tag 15

Luis Lavenarake-compiler就是为此而创建的.

但是,您确定需要C扩展吗?关于C扩展的事情是每个Ruby实现都有自己的C扩展API(而非基于X的扩展,如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(duh)的FFI(外部函数接口),它允许您以可在Ruby实现中移植的方式绑定和映射纯Ruby中的C库.FFI API最初由Evan Phoenix开发,作为Rubinius的原生扩展API ,然后由Charles Oliver Nutter(由Wayne Meissner实施)用于JRuby.韦恩随后还编写了Ruby-FFI gem,其中包含用于MRI和YARV的C扩展.洛朗圣索内蒂实现Ruby的FFI的MacRuby的,马克-安德烈·Cournoyertinyrb支持FFI(再次以书面韦恩·迈斯纳)和磁悬浮开发商也努力.这意味着如果你可以让你的库使用FFI而不是C扩展,你将自动支持6个Ruby实现,而不仅仅是一个.

唯一的理由使用C扩展,而不是一个FFI扩展是,如果你真的想实现一些特定的行为.这方面的一个例子是ParseTree宝石,它深入到MRI的肠道并且撕掉了解析树的内存中表示.

最后但并非最不重要的是,看看John CroisantNice-FFI项目,该项目旨在使Ruby-FFI更加出色.