PostgreSQL拡張モジュールの配布を考えているのであれば、移植可能な構築システムを準備することはかなり難しいものになるかもしれません。 このためPostgreSQLインストレーションは単純な拡張モジュールをすでにインストールされているサーバに対して簡単に構築できるように、PGXSと呼ばれる拡張向けの構築基盤を提供します。 PGXSは主にCコードを含む拡張を意図していますが、SQLのみからなる拡張でも使用できます。 PGXSがPostgreSQLと相互に作用する任意のソフトウェアを構築するために使用できるような万能な構築システムを意図したものではないことに注意してください。 これは単に、単純なサーバ拡張用の一般的な構築規則を自動化するものです。 より複雑なパッケージでは、独自の構築システムを作成する必要があるかもしれません。
独自の拡張でPGXS基盤を使用するためには、簡単なmakefileを作成する必要があります。
このmakefileの中で、いくつか変数を設定し、大域的なPGXSmakefileをインクルードする必要があります。
以下にisbn_issn
という名称の拡張モジュールを構築する例を示します。
このモジュールはいくつかのCコードを含む共有ライブラリ、拡張の制御ファイル、SQLスクリプト、インクルードファイル(他のモジュールが拡張の関数にSQLを経由せずにアクセスする必要があるかもしれない場合にのみ必要です)、ドキュメントテキストファイルから構成されます。
MODULES = isbn_issn EXTENSION = isbn_issn DATA = isbn_issn--1.0.sql DOCS = README.isbn_issn HEADERS_isbn_issn = isbn_issn.h PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS)
最後の3行は常に同じです。 ファイルのこの前に変数の設定と独自のmakeルールを記載してください。
以下の3個の変数の1つを構築対象に指定してください。
以下の変数も設定できます。
EXTENSION
#
拡張の名前です。
各名前に対して、
にインストールされるprefix
/share/extension
を提供しなければなりません。
extension
.control
MODULEDIR
#
DATAおよびDOCSファイルのインストール先となるはずの
サブディレクトリです。
(設定がない場合、デフォルトはprefix
/shareEXTENSION
が設定されている場合はextension
に、設定されていない場合はcontrib
になります。)
DATA
#
にインストールされる様々なファイルです。
prefix
/share/$MODULEDIR
DATA_built
#
にインストールされる、最初に構築しなければならない様々なファイルです。
prefix
/share/$MODULEDIR
DATA_TSEARCH
#
以下にインストールされる様々なファイルです。
prefix
/share/tsearch_data
DOCS
#
以下にインストールされる様々なファイルです。
prefix
/doc/$MODULEDIR
HEADERS
HEADERS_built
#
(必要に応じてビルドして)
以下にインストールをするファイル。
prefix
/include/server/$MODULEDIR/$MODULE_big
DATA_built
と違って、HEADERS_built
のファイルはclean
ターゲットによって削除されません。削除したい場合には、それらをEXTRA_CLEAN
にも加えるか、削除を行う独自のルールを追加してください。
HEADERS_$MODULE
HEADERS_built_$MODULE
#
(指定されていたならビルド後に)
の下にインストールするファイル。ここでのprefix
/include/server/$MODULEDIR/$MODULE$MODULE
はMODULES
かMODULE_big
で使われているモジュール名でなければなりません。
DATA_built
と違って、HEADERS_built_$MODULE
のファイルはclean
ターゲットによって削除されません。削除したい場合には、これらをEXTRA_CLEAN
にも加えるか、削除を行う独自のルールを追加してください。
同じモジュールあるいは任意の組み合わせに対して両方の変数を使うことは正当ですが、MODULES
リストにプレフィックスbuilt_
の有無しか異ならない二つのモジュール名を書く場合を除きます。これは両義解釈をひき起こすでしょう。
このような(おそらくありそうにない)場合、HEADERS_built_$MODULE
変数だけを使うべきです。
SCRIPTS
#
にインストールされるスクリプトファイルです(バイナリファイルではありません)。
prefix
/bin
SCRIPTS_built
#
にインストールされる、最初に構築しなければならないスクリプトファイルです(バイナリファイルではありません)。
prefix
/bin
REGRESS
#リグレッションテストケース(接尾辞がない)のリストです。 後述します。
REGRESS_OPTS
#pg_regressに渡す追加オプションです。
ISOLATION
#分離性試験のリストです。 詳細は後述します。
ISOLATION_OPTS
#pg_isolation_regressに渡す追加オプションです。
TAP_TESTS
#TAPテストを実行する必要があるかどうかを定義するオプションです。 後述します。
NO_INSTALL
#
install
ターゲットを定義しません。
構築物をインストールする必要のないテストモジュールに有用です。
NO_INSTALLCHECK
#
installcheck
ターゲットを定義しません。
テストの際に特殊な設定が必要、あるいはpg_regressを使用しない場合などに有用です。
EXTRA_CLEAN
#
make clean
で削除される追加ファイルです。
PG_CPPFLAGS
#
CPPFLAGS
の先頭に加えられます。
PG_CFLAGS
#
CFLAGS
に加えられます。
PG_CXXFLAGS
#
CXXFLAGS
に加えられます。
PG_LDFLAGS
#
LDFLAGS
の先頭に加えられます。
PG_LIBS
#
PROGRAM
のリンク行に追加されます。
SHLIB_LINK
#
MODULE_big
リンク行に追加されます。
PG_CONFIG
#
構築対象のPostgreSQLインストレーション用のpg_configプログラムへのパスです。
(通常はPATH
内の最初に見つかるpg_config
が単純に使用されます)
このmakefileをMakefile
として拡張を保管するディレクトリ内に保管してください。
その後コンパイルするためにmake
を、モジュールをインストールするためにmake install
を行うことができます。
デフォルトでは、PATH
の中で最初に見つかるpg_config
プログラムが対応するPostgreSQLインストレーション用に拡張はコンパイルされ、インストールされます。
makefileまたはmake
のコマンドラインのいずれかでPG_CONFIG
を別のpg_config
プログラムを指し示すように設定することで、別のインストレーションを使用できます。
構築ディレクトリを別にしておきたいのであれば、拡張のソースツリーの外のディレクトリでmake
を実行することもできます。
この方法はVPATH構築とも呼ばれます。
以下にやり方を示します。
mkdir build_dir cd build_dir make -f /path/to/extension/source/tree/Makefile make -f /path/to/extension/source/tree/Makefile install
あるいは、コアコードと同様な方法でVPATH構築用のディレクトリを設定できます。
そのようにする1つの方法は、コアスクリプトconfig/prep_buildtree
を使うことです。
一度そうすれば、make
変数VPATH
を以下のように設定することで、構築できます。
make VPATH=/path/to/extension/source/tree make VPATH=/path/to/extension/source/tree install
この方法はより様々なディレクトリのレイアウトで機能します。
REGRESS
変数に列挙されたスクリプトは、make install
を実行した後でmake installcheck
によって呼び出すことができる、作成したモジュールのリグレッションテストで使用されます。
これが動作するためには、PostgreSQLサーバが実行していなければなりません。
REGRESS
変数に列挙されたスクリプトは、拡張のディレクトリ内のsql/
という名前のサブディレクトリ内に存在しなければなりません。
これらのファイルは.sql
という拡張子を持たなければなりません。
この拡張子はmakefile内のREGRESS
リストには含まれません。
また試験ごとにexpected/
という名前のサブディレクトリ内に想定出力を内容として含む、同じステムに.out
拡張子を付けた名前のファイルがなければなりません。
make installcheck
はpsqlを用いて各試験スクリプトを実行し、結果出力が想定ファイルに一致するかどうか比較します。
何らかの差異はdiff -c
書式でregression.diffs
に書き出されます。
想定ファイルがない試験を実行しようとすると「問題」として報告されます。
このためすべての想定ファイルがあることを確認してください。
ISOLATION
変数に列挙されたスクリプトは、make install
を実行した後でmake installcheck
によって呼び出すことができるモジュールでの同時実行中のセッションの振舞いの負荷テストで使用されます。
これが動作するためには、PostgreSQLサーバが実行していなければなりません。
ISOLATION
変数に列挙されたスクリプトは、拡張のディレクトリ内のspecs/
という名前のサブディレクトリ内に存在しなければなりません。
これらのファイルは.spec
という拡張子を持たなければなりません。
この拡張子はmakefile内のISOLATION
リストには含まれません。
また試験ごとにexpected/
という名前のサブディレクトリ内に想定出力を内容として含む、同じステムに.out
拡張子を付けた名前のファイルがなければなりません。
make installcheck
は各試験スクリプトを実行し、結果出力が想定ファイルに一致するかどうか比較します。
何らかの差異はdiff -c
書式でoutput_iso/regression.diffs
に書き出されます。
想定ファイルがない試験を実行しようとすると「問題」として報告されます。
このためすべての想定ファイルがあることを確認してください。
TAP_TESTS
はTAPテストの指定を有効にします。
各試験の実行によるデータはtmp_check/
という名前のサブディレクトリに含まれます。
詳細は33.4を参照してください。
想定ファイルを作成する最も簡単な方法は、空のファイルを作成し、試験を実行する(当然差異が報告されます)ことです。
(REGRESS
の試験による)results/
ディレクトリまたは(ISOLATION
の試験による)output_iso/results/
ディレクトリ内で見つかる実際の結果ファイルを確認し、テストの想定結果と合致するのであれば、expected/
にコピーしてください。