由于the inflexibility of mkmf
,我的C代码越来越难以管理。出于这个原因,我想使用另一个构建系统。
为了构建C扩展,rubygems
需要什么?如何将autotools
/ configure
等构建系统集成到工作流程中?
Gem::Specification.new 'my_gem' do |gem|
# Will this work?
gem.extensions = %w(ext/my_gem/configure)
end
答案 0 :(得分:5)
有一些工具可以帮助解决这种问题(例如rake-compiler
gem),但我更喜欢使用RubyInline
gem。它旨在用其他语言中的实现替换Ruby代码的慢速,性能关键部分(例如,C支持开箱即用),但它也用于内联调用外部C库的代码。
RubyInline示例如下所示:
class MyClass
inline(:C) do |builder|
builder.include '<stdio.h>'
builder.c <<-END
void my_printf(char * string){
printf("%s\\n",string);
}
END
end
end
MyClass.new.my_printf("Abc")
# prints 'Abc'
RubyInline的一个很好的特性是你不必为C和Ruby保留单独的文件,一些基本的参数转换支持开箱即用,你不必编写粘合代码。不好的部分是你没有完全控制编译等。 我个人认为RubyInline是一个非常强大的解决方案。
答案 1 :(得分:4)
如果C代码非常复杂(因为你提到autotools并配置我认为它是)为什么你不考虑构建独立的C库,它独立于Ruby?然后使用粘合代码构建一个小而简单的Ruby gem。 最终,C库将在Debian或其他Linux发行版的存储库中可用,并且这种解决方案的维护将类似于所有其他gem,它们只是C库的包装器。
答案 2 :(得分:0)
看看ruby-ffi
它链接到现有库,因此不强制任何目录结构