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

2021-09-03 15:46 更新

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

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

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)該總是相同的。在這個(gè)文件的前面部分,你要對(duì)變量賦值或者增加自定義的make規(guī)則。

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

MODULES

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

MODULE_big

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

PROGRAM

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

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

EXTENSION

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

MODULEDIR

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

DATA

要安裝到prefix /share/$MODULEDIR中的隨機(jī)文件

DATA_built

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

DATA_TSEARCH

要安裝到prefix /share/tsearch_data中的隨機(jī)文件

DOCS

要安裝到prefix /doc/$MODULEDIR中的隨機(jī)文件

HEADERS
HEADERS_built

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

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

HEADERS_$MODULE
HEADERS_built_$MODULE

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

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

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

SCRIPTS

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

SCRIPTS_built

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

REGRESS

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

REGRESS_OPTS

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

ISOLATION

隔離測(cè)試用例列表,請(qǐng)參閱下文了解更多詳細(xì)信息。

ISOLATION_OPTS

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

TAP_TESTS

是否需要運(yùn)行 TAP 測(cè)試的開關(guān)定義,請(qǐng)參閱下文

NO_INSTALLCHECK

不定義installcheck目標(biāo),如果測(cè)試要求特殊的配置就會(huì)很有用,或者不使用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中的第一個(gè)pg_config

把這個(gè) makefile 作為Makefile放在保存你擴(kuò)展的目錄中。然后你可以執(zhí)行make進(jìn)行編譯,并且接著make install來安裝你的模塊。默認(rèn)情況下,該模塊會(huì)為在你的PATH中找到的第一個(gè)pg_config程序所對(duì)應(yīng)的 PostgreSQL安裝編譯和安裝。你可以通過在 makefile 中或者make命令行中設(shè)置PG_CONFIG指向另一個(gè)pg_config程序來使用一個(gè)不同的安裝。

如果你想保持編譯目錄獨(dú)立,你也可以在你的擴(kuò)展所屬的源代碼樹之外的目錄中運(yùn)行 make。 這個(gè)過程也被稱為一個(gè) VPATH 編譯。下面是做法:

mkdir build_dir
cd build_dir
make -f /path/to/extension/source/tree/Makefile
make -f /path/to/extension/source/tree/Makefile install

此外,你可以以對(duì)核心代碼所作的方式一樣為 VPATH 設(shè)置一個(gè)目錄。一種方式是使用核心腳本 config/prep_buildtree。一旦這樣做,你可以這樣設(shè)置 make變量VPATH

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

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

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

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

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

提示

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)