W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如果你正在考慮發(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
的子目錄,DATA 和 DOCS 文件會(huì)被安裝到其中(如果沒有設(shè)置,設(shè)置了prefix
/shareEXTENSION
時(shí)默認(rèn)為extension
,沒有設(shè)置EXTENSION
時(shí)默認(rèn)為contrib
)
DATA
要安裝到
中的隨機(jī)文件prefix
/share/$MODULEDIR
DATA_built
要安裝到
中的隨機(jī)文件,它們需要先被構(gòu)建prefix
/share/$MODULEDIR
DATA_TSEARCH
要安裝到
中的隨機(jī)文件prefix
/share/tsearch_data
DOCS
要安裝到
中的隨機(jī)文件prefix
/doc/$MODULEDIR
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
要安裝到
中的腳本文件(非二進(jìn)制)prefix
/bin
SCRIPTS_built
要安裝到
中的腳本文件(非二進(jìn)制),它們需要先被構(gòu)建prefix
/bin
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ò)展名 .out
。
make 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/
中。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: