如果您正在考虑分发您的 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 规则。
设置以下三个变量之一以指定要构建的内容
还可以设置以下变量
EXTENSION
#扩展名;对于每个名称,您必须提供一个
文件,该文件将安装到 extension
.control
中prefix
/share/extension
MODULEDIR
#
的子目录,其中应安装 DATA 和 DOCS 文件(如果未设置,则默认为 prefix
/shareextension
如果设置了 EXTENSION
,否则为 contrib
)
DATA
#要安装到
中的随机文件prefix
/share/$MODULEDIR
DATA_built
#要安装到
中的随机文件,这些文件需要首先构建prefix
/share/$MODULEDIR
DATA_TSEARCH
#要安装到
下的随机文件prefix
/share/tsearch_data
DOCS
#要安装到
下的随机文件prefix
/doc/$MODULEDIR
HEADERS
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
/bin
SCRIPTS_built
#要安装到
中的脚本文件(不是二进制文件),这些文件需要首先构建prefix
/bin
REGRESS
#回归测试用例列表(无后缀),请参见下文
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
#要构建的 PostgreSQL 安装的 pg_config 程序的路径(通常只需使用 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
中。请注意,尝试运行缺少预期文件的测试将被报告为 “trouble”,因此请确保您拥有所有预期文件。
在 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/
的子目录中。有关更多详细信息,另请参阅 第 31.4 节。
创建预期文件的最简单方法是创建空文件,然后进行测试运行(这当然会报告差异)。检查在 results/
目录(对于 REGRESS
中的测试)或 output_iso/results/
目录(对于 ISOLATION
中的测试)中找到的实际结果文件,然后如果它们与您对测试的预期相符,则将它们复制到 expected/
中。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。