38.18. 扩展构建基础设施#
如果您正在考虑分发您的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规则。
设置以下三个变量之一以指定构建的内容
MODULES
#要从具有相同词干的源文件构建的共享库对象列表(此列表中不包括库后缀)
MODULE_big
#要从多个源文件构建的共享库(在
OBJS
中列出对象文件)PROGRAM
#要构建的可执行程序(在
OBJS
中列出对象文件)
还可以设置以下变量
EXTENSION
#扩展名称;对于每个名称,您必须提供一个
文件,该文件将安装到extension
.control
中prefix
/share/extensionMODULEDIR
#子目录
,其中应安装 DATA 和 DOCS 文件(如果未设置,则默认为prefix
/shareextension
(如果设置了EXTENSION
)或contrib
(如果没有设置))DATA
#要安装到
中的随机文件prefix
/share/$MODULEDIRDATA_built
#要安装到
中的随机文件,需要先构建prefix
/share/$MODULEDIRDATA_TSEARCH
#要安装到
下的随机文件prefix
/share/tsearch_dataDOCS
#要安装到
下的随机文件prefix
/doc/$MODULEDIRHEADERS
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
/binSCRIPTS_built
#要安装到
中的脚本文件(非二进制文件),需要先构建prefix
/binREGRESS
#回归测试用例列表(无后缀),见下文
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安装进行编译和安装。你可以通过将PG_CONFIG
设置为指向其pg_config
程序(在 Makefile 中或在make
命令行中)来使用不同的安装。
如果您希望将构建目录分开,您还可以在扩展源树外部的目录中运行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执行每个测试脚本,并将结果输出与匹配的预期文件进行比较。任何差异都将以diff -c
格式写入文件regression.diffs
。请注意,尝试运行缺少预期文件的测试将报告为“问题”,因此请确保您拥有所有预期文件。
在ISOLATION
变量中列出的脚本用于测试与模块并发会话的行为,可以在执行make install
后通过make installcheck
调用这些脚本。要实现此功能,您必须运行一个PostgreSQL服务器。在ISOLATION
中列出的脚本文件必须出现在扩展目录中名为specs/
的子目录中。这些文件必须具有扩展名.spec
,而此扩展名不能包含在 Makefile 中的ISOLATION
列表中。对于每个测试,还应有一个文件包含预期输出,该文件位于名为expected/
的子目录中,且具有相同的主干和扩展名.out
。make installcheck
执行每个测试脚本,并将产生的输出与匹配的预期文件进行比较。任何差异都将以diff -c
格式写入文件output_iso/regression.diffs
中。请注意,尝试运行缺少预期文件的测试将被报告为“trouble”,因此请确保您拥有所有预期文件。
TAP_TESTS
启用 TAP 测试的使用。每次运行的数据都存在于名为tmp_check/
的子目录中。另请参阅第 33.4 节了解更多详情。
提示
创建预期文件的最简单方法是创建空文件,然后进行测试运行(当然会报告差异)。检查results/
目录(用于REGRESS
中的测试)或output_iso/results/
目录(用于ISOLATION
中的测试)中找到的实际结果文件,然后如果它们符合您对测试的预期,则将它们复制到expected/
中。