ServBayでPostgreSQLモジュールをコンパイルする方法
ServBayのローカルWeb開発環境でPostgreSQL開発を行う際に、データベース機能を拡張・強化するため、追加のPostgreSQLモジュール(拡張機能)をコンパイルおよびインストールする必要が生じる場合があります。これらのモジュールは、新しいデータ型や関数、演算子、インデックスアクセス方式などを提供します。
本ドキュメントでは、ServBay環境におけるPostgreSQLモジュールのコンパイルとインストールの流れを、代表的な「postgis」(地理情報システム対応)と「pg_jieba」(中国語分かち書き)モジュールの例を通じて詳しく解説します。
概要
ServBayは、柔軟で多機能な開発環境を提供し、統合されたソフトウェアパッケージ上でさらなる開発や追加コンポーネントのビルドが可能です。PostgreSQLモジュールのコンパイルには、通常、モジュールのソースコード取得、ビルドオプションの設定、特定のビルドツール(make
やcmake
など)を用いたコンパイル・インストール、そして最終的にPostgreSQL内でモジュールを有効化する流れとなります。
成功の鍵は、ServBayにおけるターゲットPostgreSQLバージョンのヘッダファイルやライブラリ、必要な依存関係を正しく認識できるコンパイル環境を整えることです。
前提条件
PostgreSQLモジュールのコンパイルを始める前に、必ずServBayが求めるビルド環境の初期化を完了してください。この工程により、コンパイラやリンカなどのビルドツール群、環境変数($PATH
, $CFLAGS
, $LDFLAGS
など)、そしてServBay固有のビルドパス設定が行われます。
ビルド環境の初期化方法は、ServBay公式ドキュメント「ServBayによる二次ビルド方法」セクションを参照してください。特に、ServBayターミナル上で特定の初期化スクリプトを実行する工程を完了させることが重要です。
PostgreSQLバージョン指定の重要性
ServBayでは、複数バージョンのPostgreSQLパッケージを並列運用できます。モジュールのコンパイル・動作は、対応するデータベースバージョン(ヘッダ、ライブラリ、内部APIなど)に厳密に依存するため、ビルド時にはターゲットPostgreSQLバージョンおよび関連ビルドパスを明確に指定する必要があります。
正しいバージョンの設定により、必要な依存ライブラリ群を適切に検出し、対象データベースと完全互換のモジュールファイルを生成できます。これにより、ビルドエラーやロード失敗、予期せぬランタイムエラーを防げます。
ここでは例として、ServBayにインストールされた「PostgreSQL 15」(例: 15.7
)を用いて説明します。実際に使用するバージョンに合わせてパス等を修正してください。
正しいパス取得には、環境変数やpg_config
ツールが役立ちます。${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/pg_config
はこのバージョン固有のインストールパスやコンパイル設定、ライブラリ・ヘッダのパス等を出力してくれるプログラムで、PostgreSQL公式で提供されています。モジュールのビルド時、pg_config
は依存先指定の要として機能します。
postgisモジュールのコンパイル
postgis
はPostgreSQLでもっとも普及している高機能拡張モジュールのひとつで、地理情報システム(GIS)向けのオブジェクトや関数をPostgreSQLでサポートし、空間データの格納・検索・解析を可能にします。ここでは「postgis-3.4.2」のビルド手順を順に解説します。
ステップ1: ソースコードのダウンロード
まずPostGIS公式サイトから、postgis-3.4.2
のソースコードアーカイブ(通常は.tar.gz
または.zip
)をダウンロードしましょう。
wget https://download.osgeo.org/postgis/source/postgis-3.4.2.tar.gz
wget
は指定URLからファイルを取得する標準的なCLIツールです。
ステップ2: ソースコードの展開
ダウンロードしたpostgis-3.4.2.tar.gz
アーカイブを適当な作業ディレクトリに展開し、解凍したディレクトリへ移動します。
tar zxvf postgis-3.4.2.tar.gz
cd postgis-3.4.2
2
tar zxvf
は.tar.gz
形式の圧縮ファイル展開、cd
はディレクトリ移動コマンドです。
ステップ3: ビルドオプションの設定
PostGISはGNU Autotools(configureスクリプト)をビルドシステムとして採用しています。ここで、ServBay内の指定PostgreSQLバージョンと必須ライブラリのパスなどをパラメータ指定して設定します。
./configure \
--prefix=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7 \
--bindir=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin \
--datarootdir=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/share \
--with-protobufdir=${SERVBAY_BIN_PATH} \
--disable-nls \
--without-raster \
--without-topology \
--with-pgconfig=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/pg_config \
CFLAGS="${CFLAGS} -I${SERVBAY_COMMON_INCLUDE_PATH}/libxml2 -I${SERVBAY_COMMON_INCLUDE_PATH}" \
CXXFLAGS="${CXXFLAGS} -std=c++17 -I${SERVBAY_COMMON_INCLUDE_PATH}/libxml2 -I${SERVBAY_COMMON_INCLUDE_PATH}" \
LDFLAGS="${LDFLAGS} -L${SERVBAY_COMMON_LIB_PATH} -lxml2 -lz -lpthread -liconv -licui18n -licuuc -licudata -lm"
2
3
4
5
6
7
8
9
10
11
12
./configure
:設定スクリプトの実行--prefix
,--bindir
,--datarootdir
:インストール先をServBay内の該当PostgreSQLバージョンのディレクトリ配下に指定(${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7
はバージョン15.7のインストールルート。初期化スクリプトによりセットされます)--with-protobufdir
:PostGISが必要とするprotobufライブラリのパスを指定(${SERVBAY_BIN_PATH}
はServBayパッケージのバイナリパス)--disable-nls
:国際化対応を無効化(開発環境では不要な場合が多い)--without-raster
,--without-topology
:RasterやTopology機能を無効化。依存ライブラリ削減のため。必要に応じオンに可--with-pgconfig
:最重要指定—ターゲットのpg_config
パス。PostgreSQLのビルド情報・パス群をpostgis側に正しく伝え、互換性を保証CFLAGS
,CXXFLAGS
,LDFLAGS
:C/C++コンパイラ・リンカへ追加パラメータを付与-I${SERVBAY_COMMON_INCLUDE_PATH}/libxml2 -I${SERVBAY_COMMON_INCLUDE_PATH}
:libxml2等のインクルードパスを追加-L${SERVBAY_COMMON_LIB_PATH} -lxml2 -lz ...
:共通ライブラリパス・リンク設定-std=c++17
:C++17標準モードを指定(現代的C++コードの多くで必須)
ステップ4: コンパイル・インストール
configure完了後、make
でコンパイルし、make install
で指定したPostgreSQLインストール先ディレクトリ下へすべてのファイルをコピーします。
make -j ${CPU_NUMBER}
make install
2
make -j ${CPU_NUMBER}
:並列ビルド指定(ServBay環境変数${CPU_NUMBER}
を使ってCPUコア数を活用し高速化)make install
:生成された共有ライブラリやSQLスクリプトなどをPostgreSQL 15.7のインストール先規定ディレクトリ(通常lib/postgresql
やshare/postgresql/extension
以下)へ配置
ステップ5: モジュールの有効化確認
ビルド・インストール後、PostgreSQLデータベース内でpostgis
拡張を有効化します。ServBayのコマンドラインか任意のPostgreSQLクライアントからデータベースへ接続し、次のSQLを実行してください。
psql(PostgreSQLのCLI)による確認例(ServBayターミナル上で環境変数ロード済みであることが前提):
# CREATE EXTENSIONコマンドでPostGISを有効化
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "CREATE EXTENSION postgis;"
2
成功すれば拡張の作成完了です。さらにバージョン情報も確認できます:
# PostGISのバージョンを確認
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "SELECT PostGIS_Version();"
2
問題なくバージョンが表示されれば、モジュールのビルド・インストール・有効化に成功しています。
pg_jiebaモジュールのコンパイル
pg_jieba
はC++ライブラリcppjieba
をベースにしたPostgreSQL拡張で、中国語分かち書き機能を提供します。全文検索などの用途に活用されます。ビルドシステムはCMakeを使用しています。以下、その手順です。
ステップ1: ソース取得
まずGitHubからpg_jieba
リポジトリをクローンします。pg_jieba
はcppjieba
をGitサブモジュールとして利用しているため、サブモジュールの初期化・更新処理も必要です。
git clone https://github.com/jaiminpan/pg_jieba.git
cd pg_jieba
git submodule update --init --recursive
2
3
git clone ...
:pg_jieba
のソースリポジトリ取得git submodule update --init --recursive
:サブモジュール(cppjieba
)の初期化と最新版取得
ステップ2: ビルドオプションの設定(CMake)
pg_jieba
はCMakeによるクロスプラットフォームビルドを採用しています。cmake
コマンドで設定を行い、PostgreSQLやServBay環境の各種パラメータを指定します。
cmake -S . -B builddir \
-DCMAKE_PREFIX_PATH=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${BUILD_OS_MIN_VERSION} \
-DCMAKE_OSX_ARCHITECTURES=${BUILD_CPU_ARCH_CMAKE}
2
3
4
cmake -S . -B builddir
:現ディレクトリからsources
を、builddir
ディレクトリでビルド-DCMAKE_PREFIX_PATH
:重要パラメータ—依存ライブラリやヘッダ取得先(PostgreSQLを含む)として、ServBayのPostgreSQL15.7インストール先を指定。CMakeとpg_config
情報を組み合わせ依存パスを確定-DCMAKE_OSX_DEPLOYMENT_TARGET
:出力バイナリの最小対応macOSバージョン指定(${BUILD_OS_MIN_VERSION}
は環境提供)-DCMAKE_OSX_ARCHITECTURES
:ビルドするCPUアーキテクチャ(例:x86_64
,arm64
。${BUILD_CPU_ARCH_CMAKE}
は環境提供)
ステップ3: コンパイル・インストール(CMake編)
設定後、cmake --build
でコンパイルし、cmake --install
でインストールします。
cmake --build builddir -j ${CPU_NUMBER}
cmake --install builddir
2
cmake --build builddir
:builddir
でビルドプロセスを開始-j ${CPU_NUMBER}
:並列ビルド指定cmake --install builddir
:インストールパス(CMake内部ロジック・pg_config
情報に基づく)へ成果物配置(通常、lib/postgresql
やshare/postgresql/extension
フォルダ下)
ステップ4: モジュールの有効化確認
ビルド・インストール後に、PostgreSQLデータベース内でpg_jieba
拡張を有効化します。接続して次のSQLを実行しましょう。
ServBay環境のpsql
での操作例:
# CREATE EXTENSIONコマンドでpg_jiebaを有効化
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "CREATE EXTENSION pg_jieba;"
2
成功すれば拡張有効化完了。さらにpg_available_extensions
ビューでモジュール情報の確認も可能です。
# インストール済み拡張一覧の確認
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "SELECT * FROM pg_available_extensions WHERE name = 'pg_jieba';"
2
リストにモジュールが含まれていれば、ビルド~インストール~有効化まで問題なく進行しています。
よくある質問(FAQ)
- ビルドエラーでヘッダやライブラリが見つからないと出る場合は?
- ServBayのビルド環境を正しく初期化したかを再確認してください。ターミナルで初期化スクリプトを実行し、
$CFLAGS
や$LDFLAGS
、${SERVBAY_COMMON_INCLUDE_PATH}
、${SERVBAY_COMMON_LIB_PATH}
等、全ての関連環境変数が正しいServBayパスに設定されているか確認してください。 - Autotoolsの場合
--with-pgconfig
、CMakeの場合-DCMAKE_PREFIX_PATH
で指定するPostgreSQLバージョンパスが有効であるか、該当ディレクトリ内にpg_config
バイナリが実在し実行可能か確認してください。 - 一部モジュールではServBayの標準ライブラリ外の依存(例:PostGISのRaster/TopologyサポートでのGEOS, GDALなど)が必要です。不足があれば依存を自前インストールするかビルド時オプションで無効化しましょう。
- ServBayのビルド環境を正しく初期化したかを再確認してください。ターミナルで初期化スクリプトを実行し、
CREATE EXTENSION
でモジュールが見つからないと出る場合は?make install
(Autotools)またはcmake --install
(CMake)がエラーなく実行されたかログを再確認してください。モジュールファイルが想定どおりのインストール先に配置されているかも確認してください。- ビルド時のパス指定(
--prefix
または-DCMAKE_PREFIX_PATH
)が対象PostgreSQLバージョンの正しいディレクトリを指しているかを必ず見直してください。通常、モジュールはその下のlib/postgresql
に配置されます。 - PostgreSQLサービスの再起動を試してください。新モジュール検出のため、再起動が必要な場合があります。再起動はServBayアプリ画面から簡単に操作できます。
- PostgreSQLの
shared_preload_libraries
設定も参照してください。通常のCREATE EXTENSION
方式なら不要ですが、内部フックが必要な一部拡張では記述が必要な場合があります。各モジュールの公式ドキュメントもご確認ください。
- 異なるバージョンのPostgreSQL用にビルドするには?
- 基本的な手順は同じですが、
./configure
やcmake
の設定時、--with-pgconfig
または-DCMAKE_PREFIX_PATH
をターゲットバージョンのpg_config
パス(例:${SERVBAY_PACKAGE_FULL_PATH}/postgresql/14/14.x/bin/pg_config
や${SERVBAY_PACKAGE_FULL_PATH}/postgresql/14/14.x
)に変更してください(14.x
は該当バージョン番号)。
- 基本的な手順は同じですが、
まとめ
以上、ServBayのビルド環境とツール群を活用し、必要なPostgreSQLモジュールをローカル開発環境で自在にコンパイル・インストールする方法を解説しました。ビルド環境の初期化、ターゲットPostgreSQLバージョンの明示指定、各種設定やインストールパスの丁寧なチェックが、成功のカギとなります。
本ドキュメントが、ServBay上でのPostgreSQL環境カスタマイズと拡張に役立つことを願っています。万一さらなる問題が発生した場合は、他のServBay公式ドキュメントやコミュニティリソースもご参照ください。