Vcpkg-rsでCargoからVcpkgをいい感じに利用する
以前SnappyをFFIで利用するプログラムをつくった際、ビルドスクリプトを書く機会があって下のようなコードを書いた
Before
//build.rs fn main{ // static library(*.lib) println!("cargo:rustc-link-search=native=<path_to_vcpkg>/installed/x64-windows/lib/"); // dynamic library(*.dll) println!("cargo:rustc-env=PATH=<path_to_vcpkg>/installed/x64-windows/bin/"); }
シンプルだけどちょっと長々しい
After
//build.rs fn main(){ extern crate vcpkg; vcpkg::find_package("snappy").unwrap(); }
Vcpkg-rsを使うとこのように短くなる。
準備 ※Windowsの場合
公式ドキュメントに大体書いてる。大体3ステップで済んだ
https://docs.rs/vcpkg
Cargo.tomlに[build-dependencies]
とvcpkg
を追記
[package] ... [dependencies] ... [build-dependencies] vcpkg = "0.2"
次に、PowerShellを起動しvcpkg integrate install
を実行
Vcpkgの/installed/x64-windows/bin
にある.dllをプロジェクトのルートディレクトリ直下に置く。
もしくは環境変数VCPKGRS_DYNAMIC
をつくり、
値としてVcpkgのパッケージの.dllが置かれたディレクトリpathを設定する。
こんな感じ↓
set VCPKGRS_DYNAMIC=<path_to_vcpkg>/installed/x64-windows/bin
setだと今起動しているインスタンス限りで死んでしまうので、
システムの詳細設定>環境変数
に設定してもよさそう。勇気ある人はset
の代わりにsetx
使うといいと思う。
使ってみる
パッケージをインストールvcpkg install snappy
find_package()
メソッドにパッケージ名を指定する
//build.rs fn main(){ extern crate vcpkg; vcpkg::find_package("snappy").unwrap(); }
ややスッキリした。