Почему gem не компилирует мое расширение C автоматически

Я создаю драгоценный камень Ruby, который нуждается в некотором расширении C. Этот - после компиляции - связывается через Ruby FFI с драгоценным камнем.

Моя установка: я использую бандл для построения драгоценных камней. Внутри моей папки с драгоценными камнями у меня есть подпапка ext. Он включает в себя статический Makefile, еще одну подпапку source и extconf.rb.

Папка source содержит все файлы .c и .h.

Makefile не обязательно создавать динамически. Если я вызову make clean && make в ext, все скомпилируется, и драгоценный камень будет работать как положено.

Теперь я даю extconf.rb следующее содержимое:

require 'mkmf'
require 'fileutils'

# Give it a name
extension_name = 'somename'

# The destination
dir_config extension_name

# Do the work
create_makefile extension_name

# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'

Поэтому я позволил mkmf сначала создать Makefile, а затем перезаписать его моим статическим шаблоном. Глупый.

Когда я сейчас создаю свой гем через rake build и пытаюсь установить его на другую машину, расширение не компилируется.

Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы расширение автоматически компилировалось при установке?


person GeorgieF    schedule 12.09.2013    source источник
comment
Не могли бы вы показать содержимое gemspec - как он устанавливает gem.extensions (имя переменной может отличаться)? Кроме того, вы получаете сообщение об ошибке? Одной из причин наличия динамического make-файла является возможность изменения вещей на целевой машине, требующих различных деталей в Makefile.   -  person Neil Slater    schedule 12.09.2013
comment
Спасибо, Нил, я не знал о расширениях в gemspec. Это решило проблему.   -  person GeorgieF    schedule 12.09.2013


Ответы (1)


Благодаря подсказке Нила Слейтера решение было простым: у меня не было gem.extension в моем файле gemspec, например:

s.extensions    = %w[ext/extconf.rb]

Для всех, кто сталкивается с той же проблемой.

person GeorgieF    schedule 12.09.2013