如果您正在考慮發布您的 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)
最後三行應始終相同。在檔案的較早部分,您可以指定變數或新增自訂的 make 規則。
設定以下三個變數之一以指定要建置的內容
也可以設定以下變數
EXTENSION
#擴充套件名稱;對於每個名稱,您必須提供一個
檔案,該檔案將安裝到 extension
.control
中prefix
/share/extension
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 程式路徑 (通常只是 pg_config
,以使用您 PATH
中的第一個)。
將此 makefile 放置在包含您擴充功能的目錄中,並命名為 Makefile
。 然後您可以執行 make
來編譯,然後執行 make install
來安裝您的模組。 預設情況下,會針對與在您 PATH
中找到的第一個 pg_config
程式相對應的 PostgreSQL 安裝進行編譯和安裝擴充功能。 您可以透過設定 PG_CONFIG
以指向其 pg_config
程式來使用不同的安裝,無論是在 makefile 中還是在 make
命令列中。
如果您想將建置目錄分開,您也可以在擴充功能的來源樹之外的目錄中執行 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 建置,其方式與核心程式碼的方式類似。 一種方法是使用核心腳本 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/
的子目錄中。 另請參閱 第 31.4 節 了解更多詳情。
建立預期檔案的最簡單方法是建立空檔案,然後進行測試運行(當然會報告差異)。 檢查在 results/
目錄(對於 REGRESS
中的測試)或 output_iso/results/
目錄(對於 ISOLATION
中的測試)中找到的實際結果檔案,如果它們與您對測試的期望相符,則將它們複製到 expected/
。
如果您在文件中發現任何不正確、與您的特定功能使用經驗不符,或需要進一步澄清之處,請使用此表單回報文件問題。