libssh2,openssl,c-ares,zlib,ipv6を有効にした状態でcurlをwindows上で64bitビルドする

ドキュメント通りに進めれば良いだろうと思ったら、意外と色々とハマりどころ多かったのでメモ。
ビルド設定はすべてReleaseビルド・ランタイム/MTの設定。
/MT<->/MD、Release<->Debugに読みかえてもビルドできると思う（未検証）

#事前準備
* コンパイルには[VisualStudio2015RC](http://go.microsoft.com/fwlink/?LinkId=524433)を使う
* zlibのconfigureに[CMake3.3.0-rc4](http://www.cmake.org/files/v3.3/cmake-3.3.0-rc4-win32-x86.exe)を使う
* CMakeをコマンドラインで使えるよう{CMake_ROOT}/bin にパスを通しておく
* perl5.xを使えるようにしておく([activePerl](http://www.activestate.com/activeperl/downloads/thank-you?dl=http://downloads.activestate.com/ActivePerl/releases/5.20.2.2001/ActivePerl-5.20.2.2001-MSWin32-x64-298913.msi)入れておくと便利)

#OpenSSLのビルド
* まずOpenSSLをダウンロード。今回は[openssl-1.0.2d](https://www.openssl.org/source/openssl-1.0.2d.tar.gz)を使う
* 次のようにコマンド叩く

```lang:VS2015x64NativeToolsコマンドプロンプト
>perl Configure no-asm VC-WIN64A
>ms\do_win64a.bat
>nmake /f ms\nt.mak
```
ビルドが終了すると以下の場所にライブラリとヘッダが生成される。

* ライブラリ：{openssl_ROOT}/out32/
* ヘッダ：{openssl_ROOT}/inc32/

dllを生成したいときは、nt.makのかわりにntdll.makをnmakeすると良い。

#c-aresのビルド
* [c-ares1.10.0](http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz)をダウンロード

このままだとMakefileがVC2015に対応してないのでビルドがコケる。
MakefileのなかにVCのバージョン指定を記述してる箇所があるので、次のように追記しておく。

```lang:Makefile.msvc
!ELSEIF "$(_NMAKE_VER)" == "14.00.22816.0"
CC_VERS_NUM = 140
```

これでnmakeが通るようになったので、あとは通常通りビルド。

```lang:VS2015x64NativeToolsコマンドプロンプト
>nmake /f Makefile.msvc
```

ビルドが終了すると以下の場所に成果物が生成される。

* バイナリ：{c-ares_ROOT}/msvc140/

#libssh2のビルド
こやつは色々と罠が多かったので注意が必要。

* [libssh2-1.6.0](http://www.libssh2.org/download/libssh2-1.6.0.tar.gz)をダウンロード
* {libssh2_ROOT}/win32/ にVisualStudioのプロジェクトファイルがあるのでそれを開く
* **ターゲットアーキテクチャが/x86しかないので/x64を新規作成**
* ソリューション構成をOpenSSL LIB Releaseに設定
* **ランタイムが/MDになっているので/MTに修正する。**この作業忘れると他のOSSとランタイム競合起こして最悪死ぬ。
* OpenSSLにパスが通ってないので**ヘッダだけパスを{OpenSSL_ROOT}/inc32/ に通す**。{OpenSSL_ROOT}/includeではないことに注意
* **stdio.hと競合するのでlibssh2_config.h:27をコメントアウト**

```lang:c
//#define snprintf _snprintf
```

ここまでやればあとはCtrl+Shift+Bでビルドするだけ。
ビルドが成功すれば

* {libssh2_ROOT}/win32/Release_lib

にバイナリが生成される。

#zlibのビルド
* [zlib-1.2.8](http://zlib.net/zlib-1.2.8.tar.gz)をダウンロード
* {zlib_ROOT}直下に build ディレクトリを作成してその中へ移動する

```lang:VS2015x64NativeToolsコマンドプロンプト
cmake .. -G"Visual Studio 14 Win64"
```

* buildディレクトリの中にslnが生成されるのでそれを開きReleaseビルド

ビルドが成功すれば
{zlib_ROOT}/build/Release 下にバイナリが生成される。

#curlのビルド
* [curl-7.43.0](http://curl.haxx.se/download/curl-7.43.0.tar.gz)をダウンロード

curlはドキュメントに書いてあるとおり

* **{curl_ROOT}/../deps/include**
* **{curl_ROOT}/../deps/lib**

を作成してそこに依存物を入れるというビルドの仕方を取る。

注意：

* **zconf.hやlibssh2_config.hもdeps/include下に配置する**
* **zlibはzlib_a.lib, libssh2はlibssh2_a.libにリネームしてlib下へ配置**
* **staticビルドの.libとdllビルドの.libを混同しないようにしておく**

特にDLL/lib周りのエラーとかランタイム競合のエラーとかは死ぬほど面倒なので、ここまで作業が進行したら
**すべてのライブラリが/MT(or/MD)に統一されてるか**指差し確認したほうが良い。
大丈夫そうならあとはドキュメントに沿ってオプション指定すればOK

```lang:VS2015x64NativeToolsコマンドプロンプト
nmake /f Makefile.vc mode=static VC=14 WITH_SSL=static WITH_CARES=static WITH_ZLIB=static WITH_SSH2=static ENABLE_IPV6=yes GEN_PDB=no DEBUG=no MACHINE=x64
```

ビルドが成功すれば

* {curl_ROOT}/builds/libcurl-vc14-x64-release-static-ssl-static-cares-static-zlib-static-ssh2-static-ipv6-sspi

が生成されて、そこにbin,include,libが生成される。
ドキュメント上ではVC=12までしか記述がなかったけど、VC=14を設定してもこの通りビルドできた。

#追記
c-ares有効にしてビルドしたの今回が初めてだったけど、面白いほど速度が遅くなった。レスポンスが来るまでに13秒かかるようになったので、無効化してリビルドしたほうが良さそう。（無効化したら50ミリ秒前後に回復した）