PostgreSQLをWindows上でソースコードからビルド

VisualStudioのデバッガを使ってPostgreSQLのFDW(Foreign Data Wrapper)を開発したいと思い、PostgreSQLをソースコードからビルドする方法をまとめました。
今回使用したバージョンはPostgreSQL13.1です。

ビルドしようとしたところ以下のエラーが出たので、本項ではこのエラーの解消を含め、PostgreSQLのビルド方法を記載しています。

```
fatal error C1083: ソース ファイルを開けません。'src/fe_utils/psqlscan.c':No such file or directory
```

# エラーの原因
原因はflexのバージョンが古かったことでした。PostgreSQL13.1はflexバージョンが2.5.31以上でないといけないのですが、[GnuWin32（http://gnuwin32.sourceforge.net/packages/flex.htm）](http://gnuwin32.sourceforge.net/packages/flex.htm)のflexを使用していたため、バージョンが2.5.4と古かったです。

そこで、今回は[こちら（https://sourceforge.net/projects/winflexbison/）](https://sourceforge.net/projects/winflexbison/)のflexを使うことにしました。このパッケージにはbisonも含まれているので、bisonもGnuWin32ではなくこちらを使いました。

このパッケージのflexとbisonの実行ファイル名は、win_flex.exeとwin_bison.exeなので、PostgreSQLのビルドスクリプトを変更する必要があります（後述）。

# 事前準備
今回使用したツールとバージョンは以下のとおりです。
* Windows 10
* Visual Studio 2019
* Active Perl 5.28
* Active Tcl 8.6.9
* flex 2.6.4
* biosn 2.7

## Active Perl/Tcl
以下からインストーラをダウンロードしました。インストーラを実行し、デフォルトの設定でインストールしました。  
Perl: https://www.activestate.com/products/perl/downloads/  
Tcl: https://www.activestate.com/products/tcl/downloads/

## flex/bison
[こちら（https://sourceforge.net/projects/winflexbison/）](https://sourceforge.net/projects/winflexbison/)からzipファイルをダウンロードしました。
そのzipファイルを任意の場所に解凍し、win_flex.exeとwin_bison.exeがあるフォルダにパスを通しておきます。

# ソースコードのダウンロードと設定変更
まずPostgreSQLのソースコードを入手します。
今回はGitHubがらダウンロードしました。  
https://github.com/postgres/postgres/archive/REL_13_1.zip

zipファイルを解凍し、C:\\Projects\postgres-REL_13_1 に置くこととします。

次にflexとbisonの設定を変更します（実行ファイル名がwin_flex/win_bisonのため）。
src\tools\msvcフォルダにある、pgflex.plとpgbison.plをテキストエディタで開き、それぞれ2箇所（合計で4箇所）"win_"を記入します。

pgflex.plの17行目と53行目:

```Perl
my ($flexver) = `win_flex -V`;    # grab first line
-----
system("win_flex $flexflags -o$output $input");
```

pgbison.plの14行目と52行目:

```Perl
my ($bisonver) = `win_bison -V`;    # grab first line
-----
system("win_bison $nodep $headerflag $input -o $output");
```

# ビルド
Visual Studioのコマンドプロンプトを開き、src\tools\msvcフォルダでmkvcbuildを実行します。
![mkvcbuild![sln.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/d3002e2d-beab-9ca1-f203-b842e452f13a.png)
](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/62115601-b36d-63ef-fd4f-f97a93a7e30f.png)

すると、Visual Studioのプロジェクトファイルが作成されるので、。トップフォルダ（今回はC:\\Projects\postgres-REL_13_1）にあるpgsql.slnというソリューションファイルを開きます。

あとは、「ソリューションのビルド(B)」を実行すればOKです。
![SolutionFile](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/0e320cad-c664-f869-85a7-4bd5a35065de.png)

トップフォルダ下に、デバッグビルドの場合はDebug、リリースビルドの場合はReleaseフォルダが作成されているはずです。

# インストール
Visual Studioのコマンドプロンプト上で、src\tools\msvcフォルダでinstallを実行します。引数には、インストール先を指定します。
今回は、トップフォルダの下のpostgres1（C:\\Projects\postgres-REL_13_1\postgres1）を指定しました。
![install](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/7489618f-1120-7713-1408-2087c9c49d78.png)

installが完了すると、インストール先に以下のようなフォルダができていればインストール完了です。
![explorer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/62448c9e-89d3-6416-0da0-bda651e335e1.png)

# 実行
あとは、通常通り起動すればOKです。
binフォルダには実行プログラムが入っているのでこれらを使用します。
![explorer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/07f47aa9-6e6a-3df0-8262-8f11bf1e7cb5.png)

例えば、インストールフォルダの下にdatabasesをデータベースクラスタとする場合、以下の手順でサーバを起動しpsqlで接続できます。

1. コマンドプロンプトを起動し、binフォルダに移動します。
1. `.\initdb -D ..\databases` でデータベースクラスタを作成します。
1. `.\pg_ctl -D ..\databases start` でPostgreSQLサーバを起動します。
1. `.\createdb test` でtestというデータベースを作成します。
1. `.\psql test` でpsqlにてtestデータベースに接続します。
1. `SELECT * FROM version();`を実行し、「PostgreSQL 13.1, compiled by Visual C++ build 1928, 64-bit」のように、PostgreSQLのバージョンおよびVisualStudioでコンパイルされた旨が確認できればOKです。
![launch](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581362/79498d9e-a86f-eed8-1ead-fc1354b19c80.png)

# おわりに
VisualStudioでのPostgreSQLビルド方法を説明しました。
これでWindows上でPostgreSQLのデバッグがやりやすくなりました。

今回はflexとbisonの実行ファイル名に合わせるようにPostgreSQLのソースコードを編集しましたが、ソースコードを編集せずにwin_flex/win_bisonの実行ファイル自体の名前を変更する（win_を取り除く）ことでも対応できると思います。

# 参考文献
https://www.postgresql.jp/document/12/html/install-windows-full.html