2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 #

將 DATA 和 DOCS 檔案安裝到 prefix/share 的子目錄中(如果未設定,則預設為 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 #

pg_config 程式的路徑,用於構建 PostgreSQL 安裝(通常只需 pg_config,以便使用 PATH 中的第一個)。

將此 Makefile 放在擴充套件所在的目錄中,檔名為 Makefile。然後,您可以執行 make 進行編譯,然後執行 make install 來安裝您的模組。預設情況下,擴充套件會為 PATH 中找到的第一個 pg_config 程式對應的 PostgreSQL 安裝進行編譯和安裝。您可以透過在 Makefile 中或在 make 命令列的 PG_CONFIG 中設定 PG_CONFIG 來指向其 pg_config 程式,從而使用不同的安裝。

您可以透過在執行 make install 時設定 make 變數 prefix 來選擇一個單獨的目錄字首來安裝擴充套件檔案,如下所示:

make install prefix=/usr/local/postgresql

這將把擴充套件的控制和 SQL 檔案安裝到 /usr/local/postgresql/share,並將共享模組安裝到 /usr/local/postgresql/lib。如果字首不包含 postgrespgsql 等字串,例如:

make install prefix=/usr/local/extras

那麼 postgresql 將被追加到目錄名中,將控制和 SQL 檔案安裝到 /usr/local/extras/share/postgresql/extension,並將共享模組安裝到 /usr/local/extras/lib/postgresql。無論哪種情況,您都需要設定 extension_control_pathdynamic_library_path 來使 PostgreSQL 伺服器能夠找到這些檔案。

extension_control_path = '/usr/local/extras/share/postgresql:$system'
dynamic_library_path = '/usr/local/extras/lib/postgresql:$libdir'

如果您想將構建目錄分開,也可以在擴充套件的原始碼樹之外的目錄中執行 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 執行每個測試指令碼,並將結果輸出與匹配的預期檔案進行比較。任何差異都將寫入 regression.diffs 檔案,格式為 diff -c。請注意,嘗試執行缺少預期檔案的測試將被報告為“trouble”(麻煩),因此請確保您擁有所有預期檔案。

ISOLATION 變數中列出的指令碼用於測試與您的模組併發會話的行為,可以在執行 make install 後透過 make installcheck 呼叫。要使其工作,您必須有一個正在執行的 PostgreSQL 伺服器。在 ISOLATION 中列出的指令碼檔案必須出現在擴充套件目錄下的 specs/ 子目錄中。這些檔案必須具有 .spec 副檔名,該副檔名不得包含在 Makefile 的 ISOLATION 列表中。對於每個測試,還應該有一個包含預期輸出的檔案,位於 expected/ 子目錄中,具有相同的基名和 .out 副檔名。make installcheck 執行每個測試指令碼,並將結果輸出與匹配的預期檔案進行比較。任何差異都將寫入 output_iso/regression.diffs 檔案,格式為 diff -c。請注意,嘗試執行缺少預期檔案的測試將被報告為“trouble”(麻煩),因此請確保您擁有所有預期檔案。

TAP_TESTS 啟用了 TAP 測試的使用。每次執行的資料將包含在名為 tmp_check/ 的子目錄中。有關更多詳細資訊,請參閱 31.4 節

提示

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

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。