支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

36.18. 擴充套件建置基礎架構 #

如果您正在考慮發布您的 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 規則。

設定以下三個變數之一以指定要建置的內容

MODULES #

要從具有相同詞幹的原始檔建置的共享函式庫物件清單(不要在此清單中包含函式庫後綴)

MODULE_big #

要從多個原始檔建置的共享函式庫(在 OBJS 中列出物件檔案)

PROGRAM #

要建置的可執行程式(在 OBJS 中列出物件檔案)

也可以設定以下變數

EXTENSION #

擴充套件名稱;對於每個名稱,您必須提供一個 extension.control 檔案,該檔案將安裝到 prefix/share/extension

MODULEDIR #

prefix/share 的子目錄,DATA 和 DOCS 檔案應安裝到其中(如果未設定,如果設定了 EXTENSION,則預設為 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 必須是 MODULESMODULE_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 連結行。

將會加到 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/ 的子目錄中,具有相同的詞幹和副檔名 .outmake installcheck 使用 psql 執行每個測試腳本,並將結果輸出與相符的預期檔案進行比較。 任何差異都會以 diff -c 格式寫入檔案 regression.diffs。 請注意,嘗試運行缺少預期檔案的測試將會回報為問題,因此請確保您擁有所有預期檔案。

ISOLATION 變數中列出的腳本用於測試強調您的模組與並行會話的行為,可以在執行 make install 之後透過 make installcheck 進行呼叫。 為使此功能正常運作,您必須有一個正在運行的 PostgreSQL 伺服器。 在 ISOLATION 中列出的腳本檔案必須出現在您擴充功能目錄中名為 specs/ 的子目錄中。 這些檔案必須具有副檔名 .spec,這不得包含在 makefile 中的 ISOLATION 清單中。 對於每個測試,也應該有一個包含預期輸出的檔案,位於名為 expected/ 的子目錄中,具有相同的詞幹和副檔名 .outmake installcheck 執行每個測試腳本,並將結果輸出與相符的預期檔案進行比較。 任何差異都會以 diff -c 格式寫入檔案 output_iso/regression.diffs。 請注意,嘗試運行缺少預期檔案的測試將會回報為問題,因此請確保您擁有所有預期檔案。

TAP_TESTS 啟用 TAP 測試的使用。 每次運行的數據都存在於名為 tmp_check/ 的子目錄中。 另請參閱 第 31.4 節 了解更多詳情。

提示

建立預期檔案的最簡單方法是建立空檔案,然後進行測試運行(當然會報告差異)。 檢查在 results/ 目錄(對於 REGRESS 中的測試)或 output_iso/results/ 目錄(對於 ISOLATION 中的測試)中找到的實際結果檔案,如果它們與您對測試的期望相符,則將它們複製到 expected/

提交更正

如果您在文件中發現任何不正確、與您的特定功能使用經驗不符,或需要進一步澄清之處,請使用此表單回報文件問題。