我有一个Python的C扩展模块,我想把它提供给Rubyists。
源代码中有许多C模块,其中只有一个依赖于Python。其余的只依赖于彼此和标准库。我可以用通常的方式用python setup.py build构建它。
我一直在尝试使用newgem添加对Ruby的支持,我可以用rake gem构建一个版本的扩展。然而,组合后的源代码具有丑陋的目录布局(混合了Gem样式和Setuptools样式的结构),并且构建过程非常繁琐。
我不能简单地将所有源代码放在同一个目录中,因为mkmf会自动选择依赖于Python的模块并尝试构建它,用户不应该为了编译不会使用的模块而安装Python。我目前的技巧是让extconf.rb将独立于Python的源文件复制到与依赖于Ruby的扩展模块相同的目录中。
有没有一种更明智的方法来使代码对两种语言都可用?我应该在一个单独的Gem中复制独立于Python的代码吗?我是否应该将独立的代码作为使用autotools构建的单独的库发布?有没有一个版本的mkmf可以跳过不需要的模块?
发布于 2009-02-04 15:35:57
解决这个问题的一个方法是创建三个不同的项目:
这可能是最干净的解决方案,尽管在发布时需要做更多的工作,但它的优点是您可以发布Ruby绑定的新版本,而不必发布新的库/python绑定版本。
发布于 2009-02-05 03:54:55
作为对Johan所说的补充,我在Python中使用了一些c/c++支持库,这要归功于swig。您可以用c/c++编写代码,然后为您想要支持的每种语言创建一个中间模板。对于Python来说,这是相当轻松的,但是对于Ruby,必须做一些考虑……也就是说,我不认为pthread支持对ruby是满意的,反之亦然。
http://www.swig.org/它有一个比较陡峭的学习曲线,所以最好找一个示例项目来演示如何使用目标语言的包装器。
这绝对是一个有用的工具,因为它使您的代码更加整洁,同时仍然提供到多种语言(PHP、Python、Ruby和我相信c#)的健壮绑定。
https://stackoverflow.com/questions/511412
复制相似问题