Как обернуть расширение Ruby C в Ruby Gem? - PullRequest
9 голосов
/ 22 августа 2009

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

В частности, я хочу сделать это:

  • в Linux и MacOSX Я хотел бы скомпилировать расширение C при установке gem

  • в Windows Я хотел бы просто установить предварительно скомпилированный .so

любая помощь по этому, в частности, к примеру источника, была бы очень полезна:)

Ответы [ 2 ]

14 голосов
/ 22 августа 2009

Луис Лавена создал rake-compiler только для этой цели.

Тем не менее, вы уверены, что вам нужно расширение C? Суть расширений C в том, что каждая реализация Ruby имеет свой собственный API расширения C (и не на основе C, такие как XRuby, JRuby, Ruby.NET, IronRuby, HotRuby, MagLev, Red Sun вообще не имеют его), который означает, что ваше расширение C будет работать только на одной реализации. И поскольку MRI only реализует Ruby 1.8, а YARV only реализует Ruby 1.9, и в настоящее время мы находимся в переходной фазе между 1.8 и 1.9, есть вероятность, что многие люди будут использовать как минимум две разные реализации. (Я лично использую 5: MRI, YARV, JRuby, IronRuby и Rubinius.)

Может быть, вам лучше использовать Ruby-FFI . Ruby-FFI - это FFI (Интерфейс внешних функций) для Ruby ( duh ), который позволяет связывать и отображать библиотеки C в чистом Ruby способом, который переносим между реализациями Ruby. API FFI был впервые разработан Эваном Фениксом как собственный API расширения для Рубиниус , затем он был принят Чарльзом Оливером Наттером (и реализован Уэйн Мейснер ) для JRuby . Wayne затем также написал Ruby-FFI gem , который содержит расширения C для MRI и YARV. Лоран Сансонетти реализовал Ruby-FFI для MacRuby , Марк-Андре Курнойер * tinyrb также поддерживает FFI ( снова написано Уэйном Мейснером ) и разработчики MagLev также работают над этим. Это означает, что если вы можете заставить свою библиотеку работать с FFI, а не с расширением C, вы автоматически будете поддерживать 6 реализаций Ruby вместо одной.

Единственная причина использовать расширение C, а не расширение FFI, заключается в том, если вы действительно do хотите какое-то поведение, специфичное для реализации. Одним из примеров этого может служить камень ParseTree , который проникает глубоко в кишечник МРТ и вырывает представление в памяти дерева разбора.

И последнее, но не менее важное: взгляните на проект Nice-FFI от John Croisant , цель которого - сделать использование Ruby-FFI еще приятнее.

0 голосов
/ 09 января 2017

У меня есть репозиторий github, который я поддерживаю только для себя, и эти вещи мне помогли.

Ruby_C_extensions

Это может помочь осмотреть github, чтобы найти несколько хороших примеров драгоценных камней, уже написанных для вашего изучения, но вы можете клонировать их и посмотреть, сможете ли вы собрать их в своей системе. Если они были собраны правильно, они должны были бы просто хорошо сложиться.

Обратите внимание, что вам нужны инструменты для сборки на любой платформе, которую вы используете. Вот видео, которое я только что посмотрел и которое говорит вам, что вам нужно для Linux.

Настройка среды программирования Python

Теперь я знаю, что на нем написано Python, он показывает вам, как устанавливать пакеты инструментов сборки.

Я использую DevKit для Windows, и он работает для меня. При чем-либо установка инструментов является наиболее важной.

Я также использовал rake-compiler и hoe для настройки структуры папок. Похоже, нам нужно немного садиться, чтобы получить грабли и мотыгу. : -D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...