Vcpkg-rsでCargoからVcpkgをいい感じに利用する

github.com

以前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();
}

ややスッキリした。