【问题标题】:How do I use other build systems with rubygems?如何将其他构建系统与 ruby​​gems 一起使用?
【发布时间】:2012-03-12 23:14:44
【问题描述】:

由于the inflexibility of mkmf,我的 C 代码变得越来越难管理。出于这个原因,我想使用另一个构建系统。

rubygems 需要什么才能构建 C 扩展?如何将 autotools/configure 之类的构建系统集成到工作流程中?

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

【问题讨论】:

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


    【解决方案1】:

    有一些工具可以帮助解决这种情况(例如rake-compiler gem),但我更喜欢使用RubyInline gem。它旨在用其他语言的实现(例如,开箱即用地支持 C)替换 Ruby 代码中缓慢、性能关键的部分,但它也用于内联调用外部 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,我已经在使用 rake-compiler 并且我同意 inline 是一个了不起的工具,但问题是我确实想保留单独的Ruby 和 C 代码库。我想要替代mkmf 的原因是它强加了一个非常不灵活的文件夹结构-all files must be in the same directory as extconf.rb。我正在考虑推出自己的解决方案。
    • 很遗憾,我不知道这样的选择。
    【解决方案2】:

    如果 C 代码非常复杂(因为您提到了 autotools 和 configure,我认为是这样),您为什么不考虑构建独立于 Ruby 的单独的 C 库?然后用粘合代码构建一个小而简单的 Ruby gem。 最终,C 库将在 Debian 或其他 Linux 发行版的存储库中可用,并且此类解决方案的维护将类似于所有其他 gem,它们只是 C 库的包装器。

    【讨论】:

    • 我会强烈考虑这一点。有问题的库实现了简化的窗口和图形。由于 C 和其他语言中已经有很多替代品,我认为它不会增加太多价值。
    【解决方案3】:

    看看ruby-ffi
    它链接到现有库,因此不会强制任何目录结构

    还有http://guides.rubygems.org/c-extensions/

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多