Как я могу использовать другие системы сборки с rubygems? - PullRequest
3 голосов
/ 03 марта 2012

С моим C-кодом становится все труднее управлять из-за негибкости mkmf.По этой причине я хотел бы использовать другую систему сборки.

Что нужно rubygems для сборки расширения C?Как я могу интегрировать систему сборки типа autotools / configure в рабочий процесс?

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

Ответы [ 3 ]

5 голосов
/ 03 марта 2012

Есть некоторые инструменты, которые помогают в такой ситуации (например, rake-compiler gem), но я предпочитаю использовать RubyInline gem.Он был разработан для замены медленных, критичных к производительности разделов кода Ruby реализациями на других языках (например, C поддерживается прямо из коробки), но он также используется для встроенного кода, который вызывает внешние библиотеки C.

AПример 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 очень мощным решением.

4 голосов
/ 12 марта 2012

Если код на C довольно сложный (так как вы упоминаете autotools и configure, я предполагаю, что это так), почему бы вам не рассмотреть возможность создания отдельной библиотеки C, которая не зависит от Ruby?А затем создайте маленький и простой Ruby gem с помощью кода склеивания.Со временем библиотека C станет доступной в репозиториях для Debian или других дистрибутивов Linux, и поддержка такого решения будет аналогична всем другим гемам, которые являются просто оболочками для библиотек C.

0 голосов
/ 09 марта 2012

Взгляните на ruby-ffi
Он ссылается на существующие библиотеки, поэтому не создает никакой структуры каталогов

Также http://guides.rubygems.org/c-extensions/

...