OpenSCをWindowsでビルドする

#はじめに
GitHubのOpenSCのソースからビルドした時のメモ。
公式サイトの　[Compiling on Windows](https://github.com/OpenSC/OpenSC/wiki/Compiling-on-Windows)　を実施したときのメモです。

#環境
- OS=Windows10

#OpenSCとは
- https://github.com/OpenSC/OpenSC/wiki

#先にインストールしとく必要があるもの
[公式サイト](https://github.com/OpenSC/OpenSC/wiki/Compiling-on-Windows)で　Build Requirements　と　Build Configuration　の前半に書いてあること。
**※Edit Make.rules.makと書いてあって、手動でこのファイルを修正する必要があるように思えるが、とりあえず、この時点では修正する必要はなかった。（最後のステップで修正が必要）**

- Microsoft’s Cryptographic Provider Development Kit
	- [cngsdk.msi](http://download.microsoft.com/download/2/C/9/2C93059C-0532-42DF-8C24-9AEAFF00768E/cngsdk.msi)　をダウンロード
	- cngsdk.msi　を実行してインストール
- WiX Toolset
	- http://wixtoolset.org/
	- V3.11.1　→　wix311.exe　をダウンロードしてインストール

上記以外に必要なもの。

- Visual Studio 2015
	- 2015　である必要はないと思うがVisual Studioが必要
- サクラエディタ
	- 文字コードが原因でコンパイルエラーが出るので、その修正用
	- http://sakura-editor.sourceforge.net/download.html
	- sakura_install2-2-0-1.exe (2.2.0.1)
- MSYS2
	- http://www.msys2.org/
	- msys2-x86_64-20161025.exe をダウンロードしてインストール
- MSYS2 のコマンドいろいろ
	- MSYS2 インストールして　Windowsのメニューから　MSYS2 MinGW 64-bit（コンソール）　を起動
	- コンソールから　pacman コマンドを使ってインストールする。以下のコマンド。
	- 実行するコマンド①　→　`pacman -S base-devel`
	- 実行するコマンド②　→　`pacman -S msys2-devel`
	- これで　autoconf,automake,libtool,make,gcc,pkg-config　あたりは全部使えるようになる。

[参考](https://qiita.com/MoriokaReimen/items/dbe1448ce6c0f80a6ac1)

```bash
:pacmanメモ

ローカルにインストールされたソフトウェアの検索には-Qsオプションを使います。
pacman -Qs [検索したいソフトウェアパッケージ名]

より詳細を知りたい場合は-Qiオプションを使います。
pacman -Qi [検索したいソフトウェアパッケージ名]

更に詳細を表示したい場合はiを増やします。
pacman -Qii [検索したいソフトウェアパッケージ名]
```

#ここからがビルド
[公式サイト](https://github.com/OpenSC/OpenSC/wiki/Compiling-on-Windows) Build Configuration　の真ん中あたりから

- Windowsのメニューから　MSYS2 MinGW 64-bit（コンソール）　を起動し、以下のコマンドを順番に実行していく
- **Clone（またはダウンロード）した　OpenSCフォルダ　に移動してから実行すること**

##autoreconf -i

``` bash:MSYS2コンソール
$ autoreconf -i
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
libtoolize: Remember to add 'LT_INIT' to configure.ac.
configure.ac:58: installing './compile'
configure.ac:57: installing './config.guess'
configure.ac:57: installing './config.sub'
configure.ac:28: installing './install-sh'
configure.ac:28: installing './missing'
src/common/Makefile.am: installing './depcomp'
※これでOK
```

##./configure --disable-openssl --disable-readline --disable-zlib

``` bash:MSYS2コンソール
$ ./configure --disable-openssl --disable-readline --disable-zlib
configure: loading site script /mingw64/etc/config.site
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
・・・
config.status: creating MacOSX/resources/Welcome.html
config.status: creating config.h
config.status: executing depfiles commands
※これでOK
```

##make -C etc opensc.conf

``` bash:MSYS2コンソール
$ make -C etc opensc.conf
make: ディレクトリ '.../github/opensc/etc'　に入ります
make: ディレクトリ '.../github/opensc/etc' から出ます
※これでOK
```

##cp win32/winconfig.h config.h

``` bash:MSYS2コンソール
$ cp win32/winconfig.h config.h
※これでOK
```
MSYSコンソールでの作業はここまで。

##注意：[公式サイト](https://github.com/OpenSC/OpenSC/wiki/Compiling-on-Windows) Manually Creating Built Source Filesにかいてあることはやってはいけない。makeでエラーになる。（ちゃんと英語を読めばわかるのかも）

``` bash:やっちゃいけない
copy win32\winconfig.h.in win32\winconfig.h
copy src\minidriver\versioninfo-minidriver.rc.in src\minidriver\versioninfo-minidriver.rc
copy src\pkcs11\versioninfo-pkcs11.rc.in src\pkcs11\versioninfo-pkcs11.rc
copy src\pkcs11\versioninfo-pkcs11-spy.rc.in src\pkcs11\versioninfo-pkcs11-spy.rc
copy src\tools\versioninfo-tools.rc.in src\tools\versioninfo-tools.rc
copy win32\OpenSC.wxs.in win32\OpenSC.wxs
copy win32\versioninfo-customactions.rc.in win32\versioninfo-customactions.rc
copy win32\versioninfo.rc.in win32\versioninfo.rc
copy win32\winconfig.h.in win32\winconfig.h
```

#やっとMake
[公式サイト](https://github.com/OpenSC/OpenSC/wiki/Compiling-on-Windows) Build OpenSC　のところ
**さらっと書いてあるが、一番大変。**

- Windowsのメニューから　**開発者コマンド プロンプト for VS2015**　を起動し、コマンドを実行していく
- **Clone（またはダウンロード）した　OpenSCフォルダ　に移動してから実行すること**

##nmake /f Makefile.mak

``` bash:VisualStudio開発者コマンドプロンプトでnmake
C:\GitHub\OpenSC>nmake /f Makefile.mak

Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

copy /y winconfig.h config.h
1 個のファイルをコピーしました。
rc /l 0x0409 versioninfo-customactions.rc
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.

cl /O1 /GS /W3 /WX /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_WARNINGS /MT /nologo /DHAVE_CONFIG_H /I..\..\win32 /I..\..\src       "/IC:\Program Files (x86)\Microsoft CNG Development Kit\Include" "/IC:\Program Files (x86)\WiX Toolset v3.11\\SDK\VS2015\inc" /DWINVER=0x0601 /D_WIN32_WINNT=0x0601 /DWIN32_LEAN_AND_MEAN    /DENABLE_MINIDRIVER /DENABLE_SM /DOPENSC_FEATURES="\"pcsc\"" /Zi /c compat_getpass.c compat_getopt.c compat_strlcpy.c compat_strlcat.c simclist.c compat_report_rangecheckfailure.c compat___iob_func.c

C:\GitHub\OpenSC\src\libopensc/opensc.h(846): error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
C:\GitHub\OpenSC\src\libopensc/opensc.h(846): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

こんな感じのエラーが山ほど出る。
```

###error C2220　と　warning C4819　のエラーが山ほど出るので、一つ一つ修正していく必要がある。

- エラーとなったファイルをサクラエディタで開く(上記例では　opensc.h)
- 文字コードをUTF-8(BOM付き)に変更する。
	- サクラエディタで「名前を付けて保存→文字コードセット=UTF-8 , BOMのチェックをON　にして上書き保存。
	- [参考になったサイト](http://takachan.hatenablog.com/entry/2016/04/04/182351)

##文字コードを変更して、nmake /f Makefile.mak

``` bash:VisualStudio開発者コマンドプロンプトでnmake
C:\GitHub\OpenSC>nmake /f Makefile.mak

        lib /nologo /machine: /out:common.lib compat_getpass.obj compat_getopt.obj compat_strlcpy.obj compat_strlcat.obj simclist.obj compat_report_rangecheckfailure.obj compat___iob_func.obj
LINK : fatal error LNK1146: オプション '/machine:' の引数が指定されていません。
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\lib.EXE"' : リターン コード '0x47a'
Stop.

今度はこんな感じのエラーが山ほど出る。
```

###LNK1146: オプション '/machine:' というエラーが出る。
これは環境によるものかもしれません。原因不明だが、win32\Make.rules.mak　を修正する必要があるようだ

``` bash:Make.rules.mak
OPENSC_FEATURES = pcsc

# ↓この行を追加
PLATFORM = x86

#Include support for minidriver
MINIDRIVER_DEF = /DENABLE_MINIDRIVER
```

ちなみに　`PLATFORM = x64`　だと、また変なエラーが出てしまうのでx86にした。（もう疲れた）

``` bash:PLATFORM=x64にするとこんなエラー
fatal error LNK1112: モジュールのコンピューターの種類 'X86' は対象コンピューターの種類 'x64' と競合しています。
```

これで何度目かのnmakeでやっとエラーなしとなった。

``` bash:ビルドでできるもの
C:\GitHub\OpenSC>dir *.dll *.exe /S

 C:\GitHub\OpenSC\src\libopensc のディレクトリ

2018/04/28  17:33           989,184 opensc.dll
               1 個のファイル             989,184 バイト

 C:\GitHub\OpenSC\src\minidriver のディレクトリ

2018/04/28  17:34         1,046,016 opensc-minidriver.dll
               1 個のファイル           1,046,016 バイト

 C:\GitHub\OpenSC\src\pkcs11 のディレクトリ

2018/04/28  17:33           832,512 onepin-opensc-pkcs11.dll
2018/04/28  17:33           832,512 opensc-pkcs11.dll
2018/04/28  17:33           150,016 pkcs11-spy.dll
               3 個のファイル           1,815,040 バイト

 C:\GitHub\OpenSC\src\tests のディレクトリ

2018/04/28  17:34           112,128 base64.exe
2018/04/28  17:34           129,536 p15dump.exe
2018/04/28  17:34           118,784 pintest.exe
               3 個のファイル             360,448 バイト

 C:\GitHub\OpenSC\src\tools のディレクトリ

2018/04/28  17:33           123,904 cardos-tool.exe
2018/04/28  17:34           111,104 egk-tool.exe
2018/04/28  17:33           127,488 eidenv.exe
2018/04/28  17:33           118,784 iasecc-tool.exe
2018/04/28  17:33           142,336 openpgp-tool.exe
2018/04/28  17:34           112,640 opensc-asn1.exe
2018/04/28  17:33           178,176 opensc-explorer.exe
2018/04/28  17:34           156,672 opensc-notify.exe
2018/04/28  17:33           143,360 opensc-tool.exe
2018/04/28  17:33           220,672 pkcs11-tool.exe
2018/04/28  17:33           136,192 pkcs15-crypt.exe
2018/04/28  17:33           176,128 pkcs15-tool.exe
              12 個のファイル           1,747,456 バイト

 C:\GitHub\OpenSC\win32 のディレクトリ

2018/04/28  17:34           135,680 customactions.dll
               1 個のファイル             135,680 バイト

     ファイルの総数:
              21 個のファイル           6,093,824 バイト
```

##win32フォルダでnmake /f Makefile.mak OpenSC.msi

``` bash:開発者コマンドプロンプトでnmake
C:\GitHub\OpenSC>cd win32
C:\GitHub\OpenSC>nmake /f Makefile.mak OpenSC.msi

なんだかんだログがでて　OpenSC.msi　ができて終了
```

##以上でビルド終了、お疲れさまでした。