我正在使用Rust构建一个gem,我需要知道在安装gem时如何运行Rust编译器。使用C扩展,我可以使用command 1 | command 2 ...
生成Makefile。但是我该如何运行mkmf
?
目录结构如下所示:
cargo build --release
我已经创建了一个Rake任务来构建Rust库:
.
├── bin
│ ├── console
│ └── setup
├── CODE_OF_CONDUCT.md
├── Gemfile
├── Gemfile.lock
├── lib
│ ├── rmpd_adschedule
│ │ └── version.rb
│ └── rustgem.rb
├── LICENSE.txt
├── Rakefile
├── README.md
├── rustgem.gemspec
├── rust
│ ├── Cargo.lock
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── spec
├── rustgem.rb
└── spec_helper.rb
但是在安装gem时如何运行这个Rake任务?或者如何使用task :compile do
sh "cd #{File.dirname(__FILE__)}/rust && cargo build --release"
end
生成合适的Makefile? Makefile应如下所示:
mkmf
但是如果我把它放到根目录中它就行不通,我不知道如何告诉all:
cd rust/ && cargo build --release
生成这个确切的Makefile。
我在宝石加载时发现了一种愚蠢的方法:
mkmf
但这不是一个好的解决方案。
答案 0 :(得分:2)
原来我可以这样做:
# rust/extconf.rb
require 'mkmf'
create_makefile 'rust/rustgem'
system("cd #{File.dirname(__FILE__)} && cargo build --release")
在这种情况下,create_makefile
将创建一个空的Makefile。然后make将返回0 make: Nothing to be done for 'all'.
这是我们需要的,然后system
调用将完成工作。
或稍好一些:
require 'mkmf'
create_makefile 'rutgem'
File.write('Makefile', "all:\n\tcargo build --release\nclean:\n\trm -rf target\ninstall: ;")
我不确定这是否是一个好的解决方案。如果你知道一个更好的,请告诉它。
<强>更新强>
实际上,您可以将Makefile
与空extconf.rb
一起放在同一目录中,它将起作用。关于Ruby-Rust集成的博客文章:http://undefined-reference.org/2016/05/14/writing-rubygem-in-rust.html