我构建了一个Ruby gem,它需要一些C扩展。一旦编译,就通过Ruby FFI将其绑定到gem中。
我的设置:我将捆绑包用于宝石支架。在我的gems文件夹中,我有一个子文件夹ext
。这包括一个静态Makefile,另一个子文件夹source
和extconf.rb。
source
文件夹包含所有.c和.h文件。
无需动态创建Makefile。如果我在make clean && make
中调用ext
,则所有内容都会编译,并且gem可以正常运行。
现在我给extconf.rb以下内容:
require 'mkmf'
require 'fileutils'
# Give it a name
extension_name = 'somename'
# The destination
dir_config extension_name
# Do the work
create_makefile extension_name
# Overwrite Makefile
FileUtils.cp 'Makefile.template', 'Makefile'
因此,我先让mkmf创建一个Makefile,然后再用我的静态模板覆盖它。愚蠢。
当我现在通过rake build
构建我的gem并尝试将其安装在另一台计算机上时,扩展名未编译。
有人可以告诉我,为了使扩展在安装时自动编译,我必须做什么?
由于Neil Slater的提示,解决方案很简单:我的gemspec文件中没有gem.extension,如下所示:
s.extensions = %w[ext/extconf.rb]
对于面临相同问题的任何人。