Windows版PostgreSQLをソースコードからビルドしてみる

# はじめに
前回、Windows版PostgreSQLの拡張機能についての記事を書きました。

https://qiita.com/yaju/items/428eaf2920e92198d150

次は、拡張機能の`pg_hint_plan`のビルドに挑戦しようとしたのですが、ISSUEの「[Not working on windows #201](https://github.com/ossc-db/pg_hint_plan/issues/201)」によると、モジュール名：（queryjumble.obj）をリンクするためには、PostgreSQLをビルドする必要があるとのことでした。

## 参考サイト
最初に次記事を参考にPostgreSQL 14をビルドしようと思ったのですが、Active Perl/TclのSetupをダウンロードするには、ActiveState メンバーシップへの登録が必要だったため、別の方法を模索しました。登録するのが悪いわけじゃないが気兼ねなく構築したかった。

https://qiita.com/t-kataym/items/e13c268f371fb87cb118

Active Perlの代わりに、Strawberry Perlを使用している記事を探したところ、海外の記事を見つけました。

https://denhamcoder.net/2019/10/29/building-postgresql-12-from-the-source-code-using-visual-studio-2019/

PostgreSQL 16 からは[Meson](https://ja.wikipedia.org/wiki/Meson_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)) に対応しています。こちらは余裕が出来たら挑戦します。

https://theundersurfers.com/pg-meson-win/

# 事前準備
PostgreSQL 14 を使用します。今となってはバージョンが少し古いのですが仕事で使用しているため、あえてこのバージョンにしています。

今回使用したツールとバージョンは以下のとおりです。  

* Windows 11 Home
* Visual Studio 2022 Comminurty
* Build Tools for Visual Studio 2022
  * 備考:「C++ によるデスクトップ開発」にチェックを付ける
* PostgreSQL 14.18 ソースコード
  * 配布元:https://www.postgresql.org/ftp/source/v14.18/
* MSYS2 20250221
  * 配布元:https://www.msys2.org/
  * [MSYS2・MinGWって何者？](https://heka-factory.hatenablog.jp/entry/2023/06/24/185158)
* mingw-w64-x86_64-toolchain
  * Windows上でネイティブなアプリケーションを開発するためのツールチェーン(コンパイラやビルドツール等)
  * 後述するMSYS2コンソールで取得
* Flex
  * テキストスキャニングプログラムを生成するツールで、スキャナー(トークナイザーとも呼ばれる)は、テキスト内のパターンを認識するプログラム
  * 後述するMSYS2コンソールで取得
* Bison
  * Yacc互換のパーサジェネレータで構文解析を行うプログラムを生成します。flexが生成したトークンを解析して構文木を作成します
  * 後述するMSYS2コンソールで取得
* Strawberry Perl 5.40.2.1
  * 配布元:https://strawberryperl.com/

## PostgreSQL 14
postgresql-14.18.tar.gz を展開して、筆者は「C:\PostgreSQL14_Source」に格納しました。
Windows 11 からは「tar.gz」はエクスプローラから展開できるが、筆者の環境では異様に遅いため「[7-Zip](https://7-zip.opensource.jp/)」で展開しました。

## MSYS2
msys2-x86_64-20250221.exeを実行し、筆者は「C:\Tools\msys64」に格納しました。

msys2.exeを実行して msys2 コンソールを開きます。
最初のステップは、現在のビルドを最新のパッケージにアップデートすることです。  パッケージ管理システムの`pacman`を使用します。
「pacman -Syuu」と入力し、質問があれば「Y」と答えてください。
最初の部分が完了したら、一旦、msys2 コンソールを閉じます。
msys2コンソールを再度開き、「pacman -Syuu」を再実行します。今回はコマンドが続行され、正常に完了します。

## mingw-w64-x86_64-toolchain Bison Flex
ビルド プロセスをさらに実行するときに使用するいくつかのツールをインストールする必要があります。msys2 コンソールにて、下記コマンドを実行してください。

```bash
pacman -S mingw-w64-x86_64-toolchain
```

たくさんのメッセージが表示されますが、上記の pacman を実行した経験があればお馴染みのはずですので、ここでは省略します。次も同様に実行してください。

```bash
pacman -S bison flex
```

インストールされているすべてのパッケージのリストを表示するには、「pacman -Q」を実行してください。

```bash:抜粋
$ pacman -Q
bison 3.8.2-5
flex 2.6.4-4
```

## Strawberry Perl
PostgreSQLビルドと互換性のある`Perl`を`Strawberry Perl`を使います。
MSYS2にも`Perl`があるのですが PostgreSQLビルドには使えないとのことです、Unix系ですし Windowsのファイルシステムやパスの扱いに問題があるのかも知れませんね。
strawberry-perl-5.40.2.1-64bit.msiを実行し、筆者は「C:\Tools\Strawberry」に格納しました。

## 環境変数 PATH の追加手順
* Windows キー + Pause/Break キー(またはコントロールパネル > システム)
  * [システムの詳細設定]リンク
  * [詳細設定]タブ
  * [環境変数]ボタン
  * [システム環境変数]グループボックス内の「Path」を選択して [編集]ボタン

下記2つを追加します。StrawberryPerlはインストール時に追加済みでした。

* C:\Tools\StrawberryPerl\perl\bin
* C:\Tools\msys64\usr\bin

# 構築
ようやく環境準備ができたので、ビルドを実施していきます。
すぐに使用できる状態ではプロジェクト ファイルやソリューション ファイルは用意されていないため、それらを作成するためのビルド ファイルが提供されています。
このために`Perl`が必要となるわけです。

## VS 2022用開発者コマンドプロンプトの起動
VS 2022用開発者コマンドプロンプトを起動します。ネイティブx64バージョン（[ x64 Native Tools Command Prompt for VS 2022 ] ）を選択してください。これにより、ビルドツールへの正しいパスが設定されます。

## ツールの存在チェック 次のツールが見つかるかどうか確認します。perl bison flex nmake
```bat
where perl bison flex nmake
```

筆者の場合、次のように出力されました。

```bat:結果
C:\Tools\Strawberry\perl\bin\perl.exe
C:\Tools\msys64\usr\bin\perl.exe
C:\Tools\msys64\usr\bin\bison.exe
C:\Tools\msys64\usr\bin\flex.exe
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64\nmake.exe
```

## ソースコード
フォルダに移動します。
筆者の場合、「C:\PostgreSQL14_Source\src\tools\msvc」に移動しました。

```bat
cd C:\PostgreSQL14_Source\src\tools\msvc
```

## ビルドコマンドを実行
リリース(デフォルト)でビルドする場合は「build」、デバッグのみをビルドする場合は「build DEBUG」と入力してください。

```bat
build DEBUG
```

この実行には筆者のPCでは12分ほどかかりました。お茶でも飲みながら行ってください。
この実行の主な目的は、プロジェクトファイルとソリューションファイルを作成することです。今後のビルドはすべてVisual Studioから実行します。
たくさんのメッセージが表示されます。うまくいけば、以下に示すようにエラーなしでビルドが完了するはずです。エラーは赤で表示されます。エラーが先に表示されている場合もあるので、必ずスクロールして戻ってください。
完了すると、以下のメッセージが表示されます。警告は無視してください。

```text
プロジェクト "C:\PostgreSQL14_Source\pgoutput.vcxproj" (既定のターゲット) のビルドが完了しました。

プロジェクト "C:\PostgreSQL14_Source\pgsql.sln" (既定のターゲット) のビルドが完了しました。


ビルドに成功しました。

"C:\PostgreSQL14_Source\pgsql.sln" (既定のターゲット) (1) ->
"C:\PostgreSQL14_Source\plpgsql.vcxproj" (既定のターゲット) (2) ->
"C:\PostgreSQL14_Source\postgres.vcxproj" (既定のターゲット) (3) ->
(ClCompile ターゲット) ->
  C:\PostgreSQL14_Source\src\backend\access\brin\brin_bloom.c(1,1): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んで
います。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 [C:\PostgreSQL14_Source\postgres.vcxproj]


"C:\PostgreSQL14_Source\pgsql.sln" (既定のターゲット) (1) ->
"C:\PostgreSQL14_Source\libpgfeutils.vcxproj" (既定のターゲット) (7) ->
  C:\PostgreSQL14_Source\src\fe_utils\print.c(1,1): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために
、ファイルを Unicode 形式で保存してください。 [C:\PostgreSQL14_Source\libpgfeutils.vcxproj]

    2 個の警告
    0 エラー

経過時間 00:12:06.87
```

## Visual Studioでソリューションを開く
ビルドが完了すると、ソリューションとプロジェクト ファイルは「C:\PostgreSQL14_Source」に保存されます。
ソリューション「C:\PostgreSQL14_Source\pgsql.sln」を開きます。
すべてが正常に完了すると、次のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/2c41a43a-2014-4504-b57f-c72fd1352582.png)

## リリースを構築する
最後は、リリースにしてビルドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/72b4ce63-e616-4ecd-8430-7ba394e7555a.png)

```
138>plpgsql.vcxproj -> C:\PostgreSQL14_Source\Release\plpgsql\plpgsql.dll
========== ビルド: 成功 138、失敗 0、最新の状態 0、スキップ 0 ==========
=========== ビルド は 0:13 で完了し、09:54.646 分 掛かりました ==========
```

これを使ってPostgreSQLデータベースを作成し、クラスターを起動します。

VS 2022用開発者コマンドプロンプトでは、「C:\PostgreSQL14_Source\src\tools\msvc」フォルダにいることを確認してください。
installを実行します。引数には、インストール先を指定します。
例 install C:\PostgreSQL14

これにより、リリースフォルダ「C:\PostgreSQL14_Source\Release」が検索されます。存在しない場合は、デバッグフォルダ「C:\PostgreSQL14_Source\Debug」が検索されます。出力は「C:\PostgreSQL14」 に書き込まれます。

正常に完了すると、「C:\PostgreSQL14」から PostgreSQL を実行し、Visual Studio からプロセスのデバッグを実行できるようになります。

# 最後に
Windowsユーザーだと完成品のバイナリを使用するので、PostgreSQLをソースコードからビルドするのは、心理的なハードルが高く、なかなか手をつける気になれないですよね。
筆者もそうでした。でも、今回やってみたら、エラーもなくスムーズに出来ました。