Упаковка расширений Ruby C

Я нашел блог о том, как упаковать расширения Ruby C

Согласно блогу ( http://blog.x-aeon.com/2012/11/28/packaging-ruby-c... ), там написано

  • Независимые от платформы драгоценные камни Ruby с собственным расширением C

    1. Добавьте только исходные файлы расширения C: это только файлы .c и extconf.rb. Нет необходимости в Makefile и скомпилированных файлах.

    2. Добавьте каталог ext в необходимые пути

    3. Сохраняйте платформу как Ruby (независимую)

    4. Зарегистрируйте расширения C, которые вы включаете: это сообщит RubyGems, что после установки есть этап компиляции. Это делается путем указания всех путей к файлам extconf.rb.

  • Зависящие от платформы драгоценные камни Ruby с собственным расширением C

    1. Добавьте скомпилированные файлы расширения C (точно так же, как и для обычных файлов Ruby).

    2. Добавьте каталог ext в необходимые пути

    3. Установить платформу как текущую

Я проанализировал драгоценный камень Родоса. Этот драгоценный камень содержит собственные расширения (есть каталог файлов для расширений, в нем есть extconf.rb)

Однако в папке ext/ нет исходного кода C. Он имеет только makefile и файлы общей библиотеки (так и dll) с extconf.rb

Этот драгоценный камень не зависит от платформы. Согласно gemfile, по умолчанию используется Ruby. Это означает, что он может работать на любой платформе Ruby.

Если это так, то это нарушает правило 1: Добавляйте только исходные файлы расширения C: то есть только файлы .c и extconf.rb. Нет необходимости в Makefile и скомпилированных файлах для независимых от платформы драгоценных камней Ruby с собственным расширением C.

Всегда ли эти правила применяются к любому gemfile?

Кроме того, не могли бы вы объяснить: «Добавьте скомпилированные файлы расширения C (точно так же, как вы делаете это для обычных файлов Ruby)»?

Пожалуйста, помогите мне!


person Erica    schedule 17.09.2014    source источник


Ответы (2)


Похоже, что rhodes сильно кроссплатформенный, так что это значительно усложняет ситуацию. Код платформы хранится в platform с разбивкой по платформам.

Для простого драгоценного камня вы правы, содержимое должно быть в ext/. Похоже, в данном случае это было недостаточно гибко.

Если вы посмотрите в файлы в ext/, там происходит много сумасшедших вещей, это далеко за пределами заглушки по умолчанию, вставленной туда, когда вы делаете гем C-расширения.

person tadman    schedule 17.09.2014

К этому времени эта страница мертва. Лучше всего посмотреть некоторые блоги, написанные ака тендерлав.

Вот ссылка: https://tenderlovemaking.com/2009/12/18/writing-ruby-c-extensions-part-1.html

Похоже, это изложено так, как вы описали, что, я бы сказал, является нормой.

bin
ext
lib

По моему опыту, лучше всего иметь папки с одинаковыми именами, близкими к имени расширения gem, которое вы хотите создать внутри папок ext и lib. И да, поместите extconf.rb и ваши файлы C в подпапку ext 'gem_ext_name'. Но вы можете размещать вещи где угодно, если Rakefile знает, где они находятся.

Мои сборки обычно помещаются в папку tmp во время компиляции, а затем, когда общий объект создается, он копируется из временной папки в папку lib, в которой есть каталоги, перечисленные в Rakefile для копирования.

person Douglas G. Allen    schedule 27.12.2016