Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

36.18. 扩展构建基础设施 #

如果您正在考虑分发 PostgreSQL 扩展模块,那么为它们设置一个可移植的构建系统可能相当困难。因此,PostgreSQL 安装提供了一个扩展构建基础设施,称为PGXS,以便可以针对已安装的服务器轻松构建简单的扩展模块。PGXS主要用于包含 C 代码的扩展,尽管也可以用于纯 SQL 扩展。请注意PGXS并不打算成为一个通用构建系统框架,可以用来构建任何与 PostgreSQL 接口的软件;它只是自动执行了简单服务器扩展模块的常见构建规则。对于更复杂的包,您可能需要编写自己的构建系统。

要对扩展使用PGXS基础结构,您必须编写一个简单的 makefile。在 makefile 中,您需要设置一些变量并包含全局PGXSmakefile。以下是一个示例构建名为 isbn_issn 的扩展模块,它由一个包含一些 C 代码的共享库、一个扩展控制文件、一个 SQL 脚本、一个 include 文件(仅当其他模块可能需要访问扩展函数而无需通过 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/extension

MODULEDIR #

将 DATA 和 DOCS 文件安装到的 prefix/share 的子目录(如果未设置,若设置了 EXTENSION,则默认值为 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 必须在 MODULESMODULE_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 链接行

将添加到 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

另外,您可以采用一种类似于 core 代码的方式为 VPATH 构建设置一个目录。执行这一操作的一种方法是使用 core 脚本 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/ 中。