Вопрос

У меня есть модуль расширения C для Python, и я хочу сделать его доступным для рубистов.

Исходный код содержит несколько модулей C, из которых только один зависит от Python.Остальные зависят только друг от друга и стандартной библиотеки.Я могу построить его с python setup.py build обычным способом.

Я экспериментировал с добавлением поддержки Ruby, используя newgem и я могу создать версию расширения с помощью rake gem.Однако объединенный исходный код имеет уродливую структуру каталогов (смесь структур в стиле Gem и в стиле Setuptools), а процесс сборки представляет собой усложнение.

Я не могу просто хранить все исходники в одном каталоге, потому что mkmf автоматически выбирает модуль, зависящий от Python, и пытается его собрать, и пользователям не нужно устанавливать Python для компиляции модуля, который не будет использоваться.Мой текущий хак предназначен для extconf.rb чтобы скопировать независимые от Python исходные файлы в тот же каталог, что и зависимый от Ruby модуль расширения.

Есть ли более разумный способ сделать код доступным для обоих языков?Должен ли я просто дублировать независимый от Python код в отдельном Gem?Должен ли я выпустить независимый код как отдельную библиотеку, созданную с помощью autotools?Есть ли версия mkmf что может пропустить нежелательный модуль?

Это было полезно?

Решение

Один из способов решения этой проблемы — создать три разных проекта:

  • Сама библиотека, независимая от Python и Ruby.
  • Привязки Python
  • Рубиновые привязки

Вероятно, это самое чистое решение, хотя оно требует немного больше работы при выпуске релизов, но у него есть то преимущество, что вы можете выпустить новую версию привязок Ruby без необходимости отправлять новую версию привязок библиотеки/Python.

Другие советы

В дополнение к тому, что сказал Йохан, я использовал пару библиотек поддержки c/c++ в Python благодаря swig.Вы пишете свой код на C/C++, а затем создаете промежуточный шаблон для каждого языка, который хотите поддерживать.Для Python это довольно безболезненно, но для Ruby необходимо учитывать некоторые соображения...а именно, я не думаю, что поддержка pthread не устраивает Ruby или наоборот.

http://www.swig.org/Кривая обучения требует довольно крутого подхода, поэтому лучше всего найти пример проекта, демонстрирующий, как использовать оболочку для ваших целевых языков.

Это определенно полезный инструмент, поскольку он делает ваш код намного чище, сохраняя при этом надежную привязку к нескольким языкам (PHP, Python, Ruby и, я думаю, C#).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top