PostgreSQL 擴展的構(gòu)建基礎(chǔ)設(shè)施

2021-09-03 15:46 更新

如果你正在考慮發(fā)布你的PostgreSQL擴展模塊,為它們建立一個可移植的構(gòu)建系統(tǒng)實在是相當(dāng)困難。因此PostgreSQL安裝為擴展提供了一種被稱為PGXS構(gòu)建基礎(chǔ)設(shè)施,因此簡單的擴展模塊能夠在一個已經(jīng)安裝的服務(wù)器上簡單地編譯。PGXS主要是為了包括 C 代碼的擴展而設(shè)計,不過它也能用于純 SQL 的擴展。注意PGXS并不想成為一種用于構(gòu)建任何與PostgreSQL交互的軟件的通用構(gòu)建系統(tǒng)框架。它只是簡單地把簡單服務(wù)器擴展模塊的公共構(gòu)建規(guī)則自動化。對于更復(fù)雜的包,你可能需要編寫你自己的構(gòu)建系統(tǒng)。

要把PGXS基礎(chǔ)設(shè)施用于你的擴展,你必須編寫一個簡單的 makefile。在這個 makefile 中,你需要設(shè)置一些變量并且把它們包括在全局的PGXS makefile 中。這里有一個例子,它構(gòu)建一個名為isbn_issn的擴展模塊,其中包括一個含有 C 代碼的共享庫、一個擴展控制文件、一個 SQL 腳本、一個包括文件(僅當(dāng)其他模塊可能需要通過調(diào)用而不是SQL訪問這個擴展的函數(shù)時才需要)以及一個文檔文件:

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)

最后三行應(yīng)該總是相同的。在這個文件的前面部分,你要對變量賦值或者增加自定義的make規(guī)則。

設(shè)置這三個變量之一來指定要構(gòu)建什么:

MODULES

要從源文件構(gòu)建的具有相同詞干的共享庫對象的列表(不要在這個列表中包括庫后綴)

MODULE_big

一個要從多個源文件中構(gòu)建的共享庫(在OBJS中列出對象文件)

PROGRAM

一個要構(gòu)建的可執(zhí)行程序(在OBJS中列出對象文件)

還可以設(shè)置下列變量:

EXTENSION

擴展名稱;你必須為每一個名稱提供一個extension .control文件,它將被安裝到prefix /share/extension

MODULEDIR

subdirectory of prefix /share的子目錄,DATA 和 DOCS 文件會被安裝到其中(如果沒有設(shè)置,設(shè)置了EXTENSION時默認為extension,沒有設(shè)置EXTENSION時默認為contrib

DATA

要安裝到prefix /share/$MODULEDIR中的隨機文件

DATA_built

要安裝到prefix /share/$MODULEDIR中的隨機文件,它們需要先被構(gòu)建

DATA_TSEARCH

要安裝到prefix /share/tsearch_data中的隨機文件

DOCS

要安裝到prefix /doc/$MODULEDIR中的隨機文件

HEADERS
HEADERS_built

要(構(gòu)建并且)安裝在prefix /include/server/$MODULEDIR/$MODULE_big下面的文件。

DATA_built不同,HEADERS_built中的文件不會被clean目標(biāo)移除,如果想要移除它們,把它們也加入到EXTRA_CLEAN或者增加自己的規(guī)則來做這件事。

HEADERS_$MODULE
HEADERS_built_$MODULE

要安裝(如果指定了構(gòu)建則在構(gòu)建之后安裝)在prefix /include/server/$MODULEDIR/$MODULE之下的文件,這里$MODULE必須是一個在MODULES or MODULE_big中用到的模塊名。

DATA_built不同,HEADERS_built_$MODULE中的文件不會被clean目標(biāo)移除,如果想要移除它們,把它們也加入到EXTRA_CLEAN或者增加自己的規(guī)則來做這件事。

可以為同一個模塊同時使用這兩個變量或者兩者的任意組合,除非你在MODULES列表中有兩個模塊名稱僅有前綴built_上的區(qū)別,因為那樣會導(dǎo)致歧義。在那種情況下(還好不太可能),應(yīng)該僅使用HEADERS_built_$MODULE變量。

SCRIPTS

要安裝到prefix /bin中的腳本文件(非二進制)

SCRIPTS_built

要安裝到prefix /bin中的腳本文件(非二進制),它們需要先被構(gòu)建

REGRESS

回歸測試案例(不帶后綴)的列表,見下文

REGRESS_OPTS

要傳遞給pg_regress的附加開關(guān)

ISOLATION

隔離測試用例列表,請參閱下文了解更多詳細信息。

ISOLATION_OPTS

要傳遞給pg_isolation_regress的附加開關(guān)

TAP_TESTS

是否需要運行 TAP 測試的開關(guān)定義,請參閱下文

NO_INSTALLCHECK

不定義installcheck目標(biāo),如果測試要求特殊的配置就會很有用,或者不使用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

要在其中構(gòu)建的PostgreSQL安裝的pg_config程序的路徑(通常只用在你的PATH中的第一個pg_config

把這個 makefile 作為Makefile放在保存你擴展的目錄中。然后你可以執(zhí)行make進行編譯,并且接著make install來安裝你的模塊。默認情況下,該模塊會為在你的PATH中找到的第一個pg_config程序所對應(yīng)的 PostgreSQL安裝編譯和安裝。你可以通過在 makefile 中或者make命令行中設(shè)置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 設(shè)置一個目錄。一種方式是使用核心腳本 config/prep_buildtree。一旦這樣做,你可以這樣設(shè)置 make變量VPATH

make VPATH=/path/to/extension/source/tree
make VPATH=/path/to/extension/source/tree install

這個過程可以在很多種目錄布局下工作。

列舉在REGRESS變量中的腳本會被用來對你的擴展進行回歸測試,回歸測試可以在做完make install之后用make installcheck調(diào)用。要讓這能夠工作,你必須已經(jīng)有一個運行著的PostgreSQL服務(wù)器。列舉在REGRESS中的腳本文件必須在你擴展目錄的名為 sql/的子目錄中出現(xiàn)。這些文件必須帶有擴展.sql,但擴展不能被包括在 makefile 的REGRESS列表中。對每一個測試還應(yīng)該在名為expected/的子目錄中有一個包含預(yù)期輸出的文件,它具有和腳本文件相同的詞干并帶有擴展.out。make installcheck會用 psql執(zhí)行每一個測試腳本,并且將得到結(jié)果輸出與相應(yīng)的預(yù)期輸出比較。任何區(qū)別都將以diff -c格式寫入到文件regression.diffs中。注意嘗試運行一個不帶預(yù)期文件的測試將被報告為故障,因此確保你擁有所有的預(yù)期文件。

ISOLATION變量中列出的腳本用于測試強調(diào)與模塊并發(fā)會話的行為,可以在make install之后通過make installcheck 調(diào)用。 要實現(xiàn)這個工作,你必須有一個正在運行的PostgreSQL服務(wù)器。 ISOLATION中列出的腳本文件必須顯示在擴展名目錄中名為 specs/的子目錄中。 這些文件必須具備擴展名.spec,并且不得包含在 makefile 中的ISOLATION列表中。 對于每個測試,在名為expected/的子目錄中還應(yīng)該有一個包含預(yù)期輸出的文件,并且具有相同的詞干和擴展名 .out。 make installcheck執(zhí)行每個測試腳本,并將結(jié)果輸出與匹配的預(yù)期文件進行比較。 任何差異都將以diff -c的格式寫入到output_iso/regression.diffs文件中。 請注意,嘗試運行缺少其預(yù)期文件的測試將會報告trouble,因此請確保你具有全部的預(yù)期文件。

TAP_TESTS 啟用TAP測試. 每個運行中的數(shù)據(jù)都存在于名為 tmp_check/的子目錄中。 更多詳細信息,請參閱第 32.4 節(jié)

提示

創(chuàng)建預(yù)期文件最簡單的方法是創(chuàng)建空文件,然后做一次測試運行(這當(dāng)然將報告區(qū)別)。 檢查在results/目錄中找到的實際結(jié)果文件 (對于 REGRESS中的測試), 或output_iso/results/ 目錄(對于ISOLATION)中的測試,如果它們符合你的預(yù)期則把它們復(fù)制到 expected/中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號