# Visual Studio 2022にPDCurcesを導入する

cursesはUnix系システムでの端末制御ライブラリであり。テキストユーザインタフェース (TUI) アプリケーションを作成するのに使われる。

cursesはLinuxなどUNIX準拠の環境で動作するライブラリだが、UNIX以外のWindows環境用に同等の機能を持つPDCursesというライブラリが存在する。

今回はこのPDCursesを導入する方法について作業メモを残す。

## 環境
OS Windows10
Visual Studio 2022 Community

## 要点
先にこの作業の要点を記しておく。

やることは至って単純で

1. PDCursesのソースコードを取得する。
2. ビルドして`.lib`ファイルを作成する。
3. 作成した`.lib`を使えるようにプロジェクトの設定をする。

以上である。

`3`に関して言えば`PDCurses`に限った話ではなく、`C/C++`で外部ライブラリを使うときの一般的な話なので、ここではあまり触れない。

(C/C++で外部ライブラリを使うとか、読み込むというワードで検索をすればいくらでもやり方は出てくるはずなので)

キモとなるのは2で`PDCurses`のソースコードをビルドして、無事に`.lib`ファイルが作れるかどうかである。

では順番に見ていくとする。

## 1. PDCursesのソースコードを取得する。

[GitHub - wmcbrine/PDCurses: PDCurses - a curses library for environments that don't fit the termcap/terminfo model.](https://github.com/wmcbrine/PDCurses)

ここからソースコードを落とし、適当なフォルダに解凍しておく。
ひとまず`D:\tmp\PDCurses-master`に解凍したものとして話を進める。

## 2. ビルドして`.lib`ファイルを作る

### 前置き

[PDCurses for Windows console | PDCurses](https://pdcurses.org/wincon/)
ここにWindows向けのビルドに関する情報が書かれている。

要約すると、**Visual Studio用のMakefile(ビルドの設定が書かれたもの)があるので、`nmake.exe`を使ってビルドして下さいね** ということ。

`nmake.exe`とは Visual Studio に含まれているコマンドライン ツールで、Visual Studioをインストールしていれば入っているはず。

またVisual Studioをインストールしていれば、`nmake.exe`がすぐに使えるよう、もろもろの設定が済んでいる開発者用プロンプトツールも使えるはずである。

スタートメニュで「x64」と打ち込むと
`x64 Native Tools Command Prompt for VS 2022` というツールが見つかるはず、これが開発者用プロンプトツールと呼んでいるものである。

見つかったら起動する。
見つからなかったら、泣く。

またこのツールはいくつか種類がある。
この方がまとめてくれていたのでリンクを張らせてもらう。一読するべし。
[Visual Studio の Cross Tools / Native Toolsって何? - 物理の駅 Physics station by 現役研究者](https://phst.hateblo.jp/entry/2017/07/23/012916)


### ビルド

ビルドする前に、`.lib`を出力するフォルダを作っておく。
今回は以下のように出力用フォルダを作成した。

```
D
 ┗ tmp
   ┗ PDCurses-master
     ┗ out
       ┣ x64
       ┣ x64_debug
       ┣ x86
       ┗ x86_debug
```

準備ができたらまずはx64用の`.lib`を作る。
ビルドすると現在いる場所に`.lib`が作られるようなので、予め`out\x64`フォルダに移動しておく。

続いて以下のコマンドを実行する。
実行すると`out\x64`に`pdcurses.lib`ファイルが出来上がるはずだ。
(大量の.objファイルもでてくる)

```
REM 環境変数にソースコードのあるフォルダパスを設定
set PDCURSES_SRCDIR=D:\tmp\PDCurses-master

REM nmake実行
nmake -f D:\tmp\PDCurses-master\wincon\Makefile.vc
```

これでひとまず`.lib`が出来上がるはず、できなければ、泣く。
あとは必要に応じてDebug版、x86版を用意する。

### x64デバッグ版のビルドコマンド

`x64 Native Tools Command Prompt for VS 2022`を起動し以下のコマンドを実行

```
REM 出力先に移動
cd D:\tmp\PDCurses-master\out\x64_debug

REM 環境変数にソースコードのあるフォルダパスを設定
set PDCURSES_SRCDIR=D:\tmp\PDCurses-master

REM nmake実行
nmake -f D:\tmp\PDCurses-master\wincon\Makefile.vc DEBUG=Y
```


### x86版のビルドコマンド

x86版のビルドには`x64_x86 Cross Tools Command Prompt for VS 2022`を使う。
起動したら以下のコマンドを実行する。

```
REM 環境変数にソースコードのあるフォルダパスを設定
set PDCURSES_SRCDIR=D:\tmp\PDCurses-master

REM x86 Release版
cd D:\tmp\PDCurses-master\out\x86
nmake -f D:\tmp\PDCurses-master\wincon\Makefile.vc

REM x86 Debug版
cd D:\tmp\PDCurses-master\out\x86_debug
nmake -f D:\tmp\PDCurses-master\wincon\Makefile.vc DEBUG=Y
```


### Visual Studioのプロジェクト設定


前提として`PDCurses`のソースコードや、`.lib`は以下のフォルダに配置されているとして話を進める。

```
D
 ┗ tmp
   ┗ PDCurses-master ... curses.hとかがあるフォルダ
     ┗ out ... 各種libファイルがあるフォルダ
       ┣ x64
       ┣ x64_debug
       ┣ x86
       ┗ x86_debug
```

Visual Studioで適当に空のプロジェクトを作成したら、プロジェクト設定を開く。

ビルド構成は、Debut/Releaseとx86/x64で通りあるが、ほぼ同じなので
構成 Debug、プラットフォームx64の場合についてのみ記す。

1. C/C++ > 追加のインクルードディレクトリ に `D:\tmp\PDCurses-master`を追加
2. リンカー > 追加のライブラリディレクトリに `D:\tmp\PDCurses-master\out\x64_debug` を追加
3. リンカー > 入力 > 追加の依存ファイルに `pdcurses.lib`を追加

以上。
これだけ書いておけば、忘れても思い出せるはずと信じる。