我有一个用于Python的C扩展模块,我想让它可供Rubyists使用。
源有许多C模块,只有一个是依赖于Python的。其余的只依赖于彼此和标准库。我可以用通常的方式用python setup.py build
构建它。
我一直在尝试使用newgem
添加Ruby支持,我可以使用rake gem
构建扩展版本。但是,组合源有一个丑陋的目录布局(混合Gem风格和Setuptools风格的结构),构建过程是一个kludge。
我不能只将所有源保存在同一目录中,因为mkmf
会自动选择依赖于Python的模块并尝试构建它,并且用户不必安装Python来编译模块不会被使用。我目前的hack是extconf.rb
将与Python无关的源文件复制到与Ruby相关的扩展模块所在的目录中。
是否有更健全的方法使代码可用于这两种语言?我应该在一个单独的Gem中复制与Python无关的代码吗?我应该将独立代码作为使用autotools构建的单独lib发布吗?是否有可以跳过不需要的模块的mkmf
版本?
答案 0 :(得分:5)
解决这个问题的一种方法是创建三个不同的项目:
这可能是最干净的解决方案,虽然它在执行发布时需要更多的工作,但它的优势在于您可以发布新版本的Ruby绑定,而无需发布新的库/ python绑定版本。
答案 1 :(得分:0)
对Johan所说的补充,由于swig,我在Python中使用了几个c / c ++支持库。您使用c / c ++编写代码,然后为您要支持的每种语言创建一个中间模板。它对Python来说相当轻松,但必须考虑Ruby的一些注意事项......即我不认为pthread支持是对ruby满意,反之亦然。
http://www.swig.org/ 它的学习曲线有点陡峭,所以最好找一个示例项目来演示如何使用目标语言的包装器。
这绝对是一个有用的工具,因为它使您的代码更加清晰,同时仍然提供对多种语言的强大绑定(PHP,Python,Ruby,我相信c#)