vcpkgを使ってみた

vcpkgというWindows 用のC++パッケージマネージャーが公開されてます。
[Github](https://github.com/Microsoft/vcpkg)
[ドキュメント](https://docs.microsoft.com/ja-jp/cpp/vcpkg)
それを使ったときのノートです。
ceresのインストールが圧倒的に簡単で感動したので。あとqiitaになかったので。

vcpkg機能の説明はここが網羅していました。
[TechRacho 【速報】Vcpkg: Windowsの公式C++ライブラリ管理ツール](https://techracho.bpsinc.jp/hachi8833/2016_09_20/26104)

* vs2017、vs2015 update3 以降
  [(faqより)](https://github.com/Microsoft/vcpkg/blob/master/docs/about/faq.md#what-visual-c-toolsets-are-supported)  
 ⇔ vs2010/2012/2013 では"integrate install"のコマンドを実行しても、includeやlibの依存を解決してくれなかった。
* (オプション) CMake 3.8   
  MSBuild/CMakeが優先的に使われる。
  らしいけれども、CMakeインストール済み環境で試したので、どのように動作が切り替わるか、は不明。

* nuget との関係
visual studioで利用できるパッケージシステムに、[nuget](https://www.nuget.org/)というのもある。
どちらも、開発用のパッケージシステム。
nuget は基本的にdotnet用。ビルド済みのバイナリを配布する用途
vcpkg はvc専用のパッケージシステム。ソースコードを配布して、各所でビルドして使ってもらう。

# 使ってみる

## vcpkg の install

1. [Github](https://github.com/Microsoft/vcpkg)からcloneする。

1. クローンディレクトリの"bootstrap-vcpkg.bat"を実行する。
   → "vcpkg.exe"が生成される。
1. （visual studioに統合する場合）そこのフォルダで管理者権限で cmd を実行して以下のコマンドを入力。
```cmd
.\vcpkg.exe integrate install
```
これはユーザーごとに行う。

## ライブラリのインストール

利用する前に、必要なライブラリをインストールする必要があります。

* vcpkg search [名前] で利用可能なパッケージやその名前を持った利用可能ライブラリが列挙される

* 依存は移動で解決してくれる。

* x64のみ、他のパッケージが必要といったライブラリもある。
    * ceres は x64のみ
    * vtkをインストールすると、msmpiが無いとエラーになる。


zlibの64bit-dll をインストールするとき
```cmd
.\vcpkg install zlib:x64-windows
```
libpng の 32bit,staticライブラリ をインストールするとき  
  → zlib は自動で依存解決してくれる。
```cmd
.\vcpkg install libpng:x86-windows-static
```

## ライブラリを使う

### vcでintegrate install をしてあるとき

インストール済みのライブラリが自動で利用可能になる。
"#include <zlib.h>" と書くと自動で解決、dllのコピーなどをやってくれる。
(既定の追加のインクルードディレクトリに、"$(VcpkgRoot)include\"というものが増えている。）

**入り組んだインクルード関係の時**
$(VcpkgRoot) という vcのマクロが今の環境で読み込んでいるフォルダへのパス
"C:\dev\sources\vcpkg\installed\x86-windows\" など

example:
'#include &lt;pybind11\pybind11.h&gt; としてインクルードする。内部で
'#include &lt;python3.h&gt; をインクルードしているので、ファイルが見つけられなくてエラーになる。

vcの追加のインクルードフォルダに $(VcpkgRoot)include\python3.6\; を書いておくと、ちゃんと見つけてもらえる。

### CMake から使うとき

ここに書いてある。[github Example: Using Sqlite#CMake (Toolchain file)](https://github.com/Microsoft/vcpkg/blob/master/docs/examples/using-sqlite.md#cmake)

## 込み入った使い方

### このプロジェクトでは、特定のバージョンのライブラリを使う必要があるとき

[doc "プロジェクトごと"より](https://docs.microsoft.com/ja-jp/cpp/vcpkg#per-project)

ライブラリの "profile.cmake"を書き換えればできるらしい。

1. 専用にvcpkgをクローンする。
2. ライブラリの profile.cmake のバージョンを書き換える。
3. このプロジェクト用に integrate する。  
```cmd
vcpkg integrate project
```

### 自分の環境の vcpkg をほかの人に渡す

vcpkg export (ライブラリ) --zip
→ zipが作られる
--nuget オプションでnugetパッケージが作られる。

### vcpkg integrate project すると何が起きたかのメモ

```cmd
>> vcpkg integrate project

Created nupkg: d:\dev\vcpkg\scripts\buildsystems\vcpkg.d.dev.vcpkg.1.0.0.nupkg

With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:
    Install-Package vcpkg.d.dev.vcpkg.1.0.0.nupkg -Source "d:\dev\vcpkg\scripts\buildsystems"
```

書いてある通り、vs2017を起動して、「ツール」⇒「NuGetパッケージマネージャー」⇒「パッケージマネージャー コンソール」を起動。
ペーストしろと書いてあるコマンド
「Install-Package vcpkg.d.dev.vcpkg.1.0.0.nupkg -Source "d:\dev\vcpkg\scripts\buildsystems"」
を張り付けると、既定のプロジェクトに上記のnupkg参照が追加される。

。。。

じゃあそのnupkgは何者かと思ったので中身を調べると、[vcpkgのフォルダ]scripts\buildsystems\msbuild\vcpkg.targets を取り込むnupkg

そのvcpkg.targets ファイルの中身は、"vcpkg integrate project" を呼び出したvcpkgのinclude/libフォルダへの参照をプロジェクトファイルに追加しているだけ。

出力フォルダへDLLのコピーとか、libファイルのlinkなどの処理も入っていた。

# todo

private パッケージの作り方