2016-05-08 3 views
0

Я строю драгоценный камень с Rust и мне нужно знать, как запустить компилятор Rust при установке драгоценного камня. С C-расширением я могу использовать mkmf для создания Makefile. Но как я могу запустить cargo build --release?Как я могу создать библиотеку 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 

Я создал задачу Rake для создания библиотеки Rust:

task :compile do 
    sh "cd #{File.dirname(__FILE__)}/rust && cargo build --release" 
end 

Но как запустить эту Rake задачу при установке камня? Или как создать подходящий Makefile с mkmf? Makefile должен выглядеть следующим образом:

all: 
    cd rust/ && cargo build --release 

Но это не работает, если я ставлю его в корневой каталог, и я не знаю, как сказать mkmf для создания этого точного Makefile.

Я нашел один глупый способ сделать это, когда драгоценный камень загружается:

module Rustgem 
    system("cd #{File.dirname(__FILE__)}/../rust && cargo build --release") 
end 

Но это не является хорошим решением.

+0

Возможно, вы захотите, чтобы ваш * основной метод распространения был загружен предварительно построенными бинарными библиотеками. У многих людей будет установлен компилятор Rust. Конечно, было бы полезно иметь резервное решение, которое строится из источника Rust. – Shepmaster

ответ

1

Оказывается, я могу это сделать:

# 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: ;") 

Я не уверен, если это хорошее решение. Если вы знаете лучшего, расскажите об этом.

UPDATE На самом деле, вы можете положить Makefile вместе с пустой extconf.rb в том же каталоге, и он будет работать. Сообщение в блоге о интеграции Ruby-Rust: http://undefined-reference.org/2016/05/14/writing-rubygem-in-rust.html

Смежные вопросы