如何在安装gem时构建Rust库?

时间:2016-05-08 17:50:51

标签: ruby rubygems rust

我正在使用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

但这不是一个好的解决方案。

1 个答案:

答案 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