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