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

Mat*_*ira 3 ruby gem rubygems build-script ruby-c-extension

由于缺乏灵活性,mkmf我的C代码越来越难以管理.出于这个原因,我想使用另一个构建系统.

什么是rubygems需要以建设一个C扩展?如何将类似autotools/ 构建系统集成configure到工作流程中?

Gem::Specification.new 'my_gem' do |gem|
  # Will this work?
  gem.extensions = %w(ext/my_gem/configure)
end
Run Code Online (Sandbox Code Playgroud)

Ale*_*ohl 5

有一些工具可以帮助这种情况(例如rake-compiler宝石),但我更喜欢使用RubyInline宝石.它旨在用其他语言中的实现替换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'
Run Code Online (Sandbox Code Playgroud)

RubyInline的一个很好的特性是你不必为C和Ruby保留单独的文件,一些基本的参数转换支持开箱即用,你不必编写粘合代码.不好的部分是你没有完全控制编译等.我个人认为RubyInline是一个非常强大的解决方案.