如何使用rubygems的其他构建系统?

时间:2012-03-03 16:24:08

标签: ruby rubygems gem build-script ruby-c-extension

由于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

3 个答案:

答案 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
它链接到现有库,因此不强制任何目录结构

另外http://guides.rubygems.org/c-extensions/