non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

RustでGoのライブラリを使うときのCargoのbuild.rsの書き方

こんにちは。長男の保育園最後の運動会は、雨天のため、室内でのダンスの発表のみになり、次男、長男とも曲に合わせて踊るのを見学できました。kjunichiです。

背景

gccなるクレートがあり、この使い方を知っているとC言語のライブラリを使う際はこれで便利に実現できそう。 C以外の言語をRustで使う際にどうすれば実現できるかをGoで試した。

build.rsの記述

GitHubからコードを持ってくる

以下のコードでGoのソースをgit clone出来た。

Command::new("git").args(&["clone","https://github.com/kjunichi/libimgtype.git"])
.status().unwrap();

持ってきたコードをgoでビルドして共有ライブラリを作成する

cloneしたディレクトリに入って、goのコマンドを実行する、という動作は 以下のコードで出来た。

let out_dir = env::var("OUT_DIR").unwrap();

Command::new("go").args(&["build","-buildmode=c-archive","-o"])
 .arg(&format!("{}/lib/libimgtype.a", out_dir))
 .current_dir(Path::new("libimgtype"))
 .status().unwrap();

以上、でGoでlibhoge.aを作ることのができるライブラリをソースからビルドしてCargo内で 扱うことができた。

まとめ

RustからGoの便利なライブラリを共有ライブラリ化して使う方法を編み出せた! LinuxMacではc-archiveでRustのプロジェクトに静的リンクしてしまっても 問題なさそうだが、Windowsの場合、c-archive形式だとMinGWのバイナリなのでMSVCな Rustだとリンクエラーになりそうな予感。

晴れてWindowsでのGoで共有ライブラリの出力出来れば、今回の方法で対応出来そうではある。

関連記事