DoxygenをVisualStudioでlibclang依存のビルドをする

# 概要
この記事は[DoxygenPreviewer](https://qiita.com/hakua-doublemoon/items/c328a7bf0bc7a1fbef14)のmaking第一弾、一番苦労したとこです。本当にビルドで何週間使ったことか……。

ここでは:

* VisualStudioでDoxygenをビルドする（2019年版）
* Doxyfileなしでドキュメントを生成する

ことに関して書きます。
なおUbuntu（WSL）でのビルドに関しては先に書いた下記を参照してください。
https://qiita.com/hakua-doublemoon/items/34264f42251d8152246d

なお、筆者は普段cmakeもVisualStudioも使わないのでよくわからず適当なことを書いている可能性があります。

## ビルドの方針

（精確にはよくわかりませんが）doxygenはデフォルトではlibgccに依存しますが、use_libclangを使うことでlibclangに依存させることができます。
配布されているdoxygenバイナリはlibclangに依存しているため、今回のコンパイルもlibclangに依存させるようにします。
なお同じような記事 https://qiita.com/mima_ita/items/cf81db1005dc596aff95 もあります。上記の記事ではあっさりできている感じですが、筆者はlibclangのせいか、あるいは頭が悪いせいか、異常に苦労しました。

## やること

* LLVMとClangをビルドする
* flexをインストールする
* bisonをビルドする
* （cmakeをいじって）Doxygenをビルドする

ここまで必要なのかよくわかりませんが、とにかくやりました。

# 詳細
## LLVMとClangのビルド
**これが必要な理由**: DoxygenのコードがClangのヘッダーをincludeすると`DeclNodes.inc`なども要求されるから

下記のQiitaの記事、あるいは公式サイトにヒントがあります。

* [ClangのlibToolingでASTをダンプするツールを作ってみた](https://qiita.com/Chironian/items/6021d35bf2750341d80c#22-%E3%81%93%E3%81%93%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%A4%E3%81%A4clang--llvm%E3%82%92%E3%83%93%E3%83%AB%E3%83%89)  

一応手順を改めて書くと下記のようになります。

1. LLVMのコードを持ってくる
2. 持ってきたコードの中のtoolsフォルダにclangフォルダを作ってClangのコードを展開する
3. cmakeを実行する。バイナリ格納フォルダ（where to build the binaries）はLLVMのコードを展開したフォルダと別にしてください
4. generateでVS(VisualStudio)のソリューションが作れたらソリューションを開いてReleaseビルド

なお１時間以上かかります。testとかbenchmarkとかみたいなやつは省いても問題ないと思います。

## flexのインストール

**これが必要な理由**: Doxygenのコンパイル時にflex実行ファイルを要求されるから

msysなどを持っていればそれのflexを使ってもいいですし、https://sourceforge.net/projects/winflexbison/ からインストールできるようです。
Path環境変数を通してコマンドプロンプトなどから実行できることを確認しておきます。

## bisonのビルドとインストール

**これが必要な理由**: 配布されているbisonのWindows実行ファイルが古すぎるから

bisonのmakeにはconfigureをするので、msysなどが前提です。
手順としては下記のようになります:

1. bisonのソースコードを持ってくる（Ubuntuに合わせて3.0.4にしました）
2. bisonをインストールするフォルダを決める（例えば`C:/Users/user/programs/app/bison`とか、どこでもいいですが）
3. libフォルダにあるconfig.hを後述のように書き換える
4. `./configure --prefix=C:/Users/user/programs/app/bison` する
5. `make` して `make install`する
6. installしたフォルダをPath環境変数に追加する
7. コマンドプロンプトでbisonが使えることを確認する

（よくわかりませんが）configureのprefixをmsysのノリで`/bin`とかにするとDoxygenのビルドを始めたときになぜかそこを見に行って死ぬので気を付けましょう。
もしかしたらmakeしたところでhelp2manが必要とか言われるかもしれません。なくてもビルドはされるので手動でインストールしてもいいですが、help2manのインストールは簡単なのでやったほうがいいかもしれません。

### lib/config.hの書き換え

```diff
/* Define to the GNU M4 executable name. */
-#define M4 "/bin/m4
+/* #define M4 "/bin/m4 */
+#define M4 "C:\\Users\\user\\programs\\app\\bison\\bin\\m4.exe"

/* Define to "-g" if GNU M4 supports -g, otherwise to "". */
```

こうしないとdoxygenビルド中に`bison: m4 subprocess failed: No such file or directory`とか言われます（そのはず）。VisualStudioのコンソールには出てこないでログファイルを見るとわかるので怒りはひとしおです。

## Doxygenをビルドする
cmakeします。一度configureを実行するとnameとvalueの一覧が出てくるのでuse_libclangを有効にして再度configureします。（DoxygenPreviewerはdoxyappを改造しているのでbuild_appも有効にします）。
たぶんLLVMConfig.cmakeがほにゃららとか言われるのでDoxygenのフォルダ直下にあるCMakeList.txtに下記のように追記します。

```diff
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+list(APPEND CMAKE_PREFIX_PATH "C:/Users/user/source/repos/llvm/llvm_build/lib/cmake")
```

これが何かといえば、CMAKE_PREFIX_PATH という変数にlist的な形式でllvmのフォルダを追加(APPEND)しているというわけです。なので`"C:/Users/user/...`の部分は各自でllvmをbuildした(LLVMConfig.cmakeファイルがある)フォルダを書いてください。
これでcmakeのconfigureとgenerateができると思います。できたらソリューションファイルを開いてReleaseでbuildしてください。
なおbuild時には`_doxygen`プロジェクトに対してclangのincludeを追加で設定する必要があるかもしれません。clangのソースコード本体のincludeフォルダとbuildしたフォルダにあるclangのincludeフォルダを`_doxygen`プロジェクトに追加してください。[^1]

# 蛇足

* そういえばiconvの用意も必要かと思いますが、気が付いたらそこでは苦労しなかったのでこの記事には書きませんでした。


[^1]: LLVMのincludeはたぶん通っていると思います。