如果您正在考慮分發您的 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
#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
。如果字首不包含 postgres
或 pgsql
等字串,例如:
make install prefix=/usr/local/extras
那麼 postgresql
將被追加到目錄名中,將控制和 SQL 檔案安裝到 /usr/local/extras/share/postgresql/extension
,並將共享模組安裝到 /usr/local/extras/lib/postgresql
。無論哪種情況,您都需要設定 extension_control_path 和 dynamic_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/
。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。