2012-03-03 2 views
3

Мой код C становится все труднее управлять из-за the inflexibility of mkmf. По этой причине я хотел бы использовать другую систему сборки.Как использовать другие системы сборки с rubygems?

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

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

ответ

4

Если код C является довольно сложным (так как вы упоминаете Autotools и настройка Я полагаю, это is) почему вы не рассматриваете возможность создания отдельной библиотеки C, которая не зависит от Ruby? А затем создайте небольшой и простой рубиновый камень с кодом склеивания. В конце концов библиотека C станет доступной в репозиториях для Debian или других дистрибутивов Linux, и поддержание такого решения будет похоже на все другие драгоценные камни, которые являются только обертками для библиотек C.

+0

Я решительно это рассмотрю. В рассматриваемой библиотеке реализованы упрощенные окна и графика. Поскольку на C и других языках уже есть много альтернатив, я думал, что это не добавит большого значения. –

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' 

Приятной особенностью RubyInline является то, что вы не должны иметь отдельные файлы для C и Ruby, некоторые основные преобразования аргументов поддерживаются из коробки и вам не нужно писать код склеивания. Плохие части в том, что у вас нет полного контроля над компиляцией и т. Д. Лично я считаю RubyInline очень мощным решением.

+1

+1, я уже использовал 'rake-compiler', и я согласен с тем, что' inline' - удивительный инструмент, но дело в том, что я _do_ хочу сохранить отдельные кодовые базы Ruby и C. Мои причины для желания альтернативы 'mkmf' в том, что он накладывает невероятно негибкую структуру папок - [все файлы должны находиться в том же каталоге, что и' extconf.rb') (http://stackoverflow.com/q/7698192/512904). Я подумываю о том, чтобы решить мое собственное решение проблемы. –

+0

К сожалению, я не знаю такой альтернативы. –