# 38.18.扩建建筑基础设施

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

要将PGXS基础设施用于扩展,必须编写一个简单的makefile。在makefile中,需要设置一些变量,并包括全局PGXS makefile。下面是一个构建名为国际标准书号,由一个包含一些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)

最后三行应该始终相同。在文件的前面部分,可以指定变量或添加自定义规则。

设置以下三个变量之一,以指定生成的内容:

模块

从具有相同stem的源文件生成的共享库对象列表(此列表中不包括库后缀)

大模块

从多个源文件生成的共享库(在OBJS)

程序

一个可执行程序,用于构建(列出OBJS)

还可以设置以下变量:

扩大

分机名;对于每个名称,您必须提供一个*扩大*.控制文件,该文件将安装到*前缀*/共享/扩展

模块化

子目录*前缀*/分享应将数据和文档文件安装到其中(如果未设置,则默认为扩大如果扩大设置好了,或者contrib(如果没有)

数据

要安装到的随机文件*前缀*/共享/$MODULEDIR

建立的数据

要安装到的随机文件*前缀*/共享/$MODULEDIR,这需要先建造

数据搜索

要安装的随机文件*前缀*/共享/搜索数据

医生

要安装的随机文件*前缀*/doc/$MODULEDIR

标题
你造的头

要(可选地生成和)安装的文件*前缀*/包括/server/$MODULEDIR/$MODULE_big.

不像建立的数据,存档你造的头不会被清洁的目标如果要删除它们,还可以将它们添加到额外清洁或者加入你自己的规则。

U$MODULE的标题
HEADERS_Build_$MODULE

要在下安装的文件(如果指定,则在生成后)*前缀*/包括/server/$MODULEDIR/$MODULE哪里$MODULE必须是中使用的模块名模块大模块.

不像建立的数据,存档HEADERS_Build_$MODULE不会被清洁的目标如果要删除它们,还可以将它们添加到额外清洁或者加入你自己的规则。

对同一个模块或任意组合使用这两个变量是合法的,除非在同一个模块中有两个模块名模块仅因前缀的存在而不同的列表建造_,这会造成歧义。在这种情况下(希望不太可能),您应该只使用HEADERS_Build_$MODULE变量。

剧本

要安装到的脚本文件(不是二进制文件)*前缀*/垃圾箱

你建立的脚本

要安装到的脚本文件(不是二进制文件)*前缀*/垃圾箱,这需要先建造

倒退

回归测试用例列表(无后缀),见下文

回归选择

要传递到pg的附加开关_倒退

隔离

隔离测试用例列表,详见下文

隔离选择

要传递到pg的附加开关_隔离_倒退

TAP_测试

开关定义是否需要运行抽头测试,见下文

没有安装

不要定义一个安装目标,对于不需要安装构建产品的测试模块非常有用

没有支票

不要定义一个安装检查目标,有用,例如,如果测试需要特殊配置,或不使用pg_倒退

额外清洁

要在中删除的额外文件打扫干净

PG_标志

将准备好CPPFLAGS

PG_CFLAGS

将被附加到CFLAGS

PG_CXXFLAGS

将被附加到CXXFLAGS

PG_LDFLAGS

将准备好LDFLAGS

PG_LIBS

将被添加到程序连接线

SHLIB_链接

将被添加到大模块连接线

PG_配置

通往pg的道路_PostgreSQL安装的配置程序(通常只是pg_配置使用你的第一个路径)

将这个makefile作为Makefile在保存扩展名的目录中。那你就可以制作编译,然后制作安装安装您的模块。默认情况下,该扩展是为对应于第一个扩展的PostgreSQL安装而编译和安装的pg_配置在您的路径。您可以通过设置PG_配置指向它的pg_配置程序,无论是在makefile中还是在制作命令行。

你也可以跑步制作在扩展的源代码树之外的目录中,如果您想保持构建目录独立。这个过程也被称为虚拟路径建筑以下是方法:

mkdir build_dir
cd build_dir
make -f /path/to/extension/source/tree/Makefile
make -f /path/to/extension/source/tree/Makefile install

或者,您可以按照与核心代码类似的方式为VPATH构建设置目录。一种方法是使用核心脚本配置/准备构建树。完成后,您可以通过设置制作变量虚拟路径这样地:

make VPATH=/path/to/extension/source/tree
make VPATH=/path/to/extension/source/tree install

此过程可以处理更多种类的目录布局。

中列出的脚本倒退变量用于模块的回归测试,可由进行安装检查做完之后制作安装。要使其工作,您必须有一个正在运行的PostgreSQL server。中列出的脚本文件倒退必须出现在名为sql/在分机的目录中。这些文件必须有扩展名.sql,不得包含在倒退在makefile中列出。对于每个测试,在名为期待/,具有相同的茎和延伸出来. 进行安装检查使用psql执行每个测试脚本,并将结果输出与匹配的预期文件进行比较。任何差异都将写入该文件回归。差异在里面diff-c总体安排请注意,尝试运行缺少预期文件的测试将被报告为“故障”,因此请确保您拥有所有预期文件。

中列出的脚本隔离变量用于测试与模块的并发会话的行为,可由进行安装检查做完之后制作安装。要使其工作,您必须有一个正在运行的PostgreSQL server。中列出的脚本文件隔离必须出现在名为规格/在分机的目录中。这些文件必须有扩展名规格,不得包含在隔离在makefile中列出。对于每个测试,在名为期待/,具有相同的茎和延伸出来. 进行安装检查执行每个测试脚本,并将结果输出与匹配的预期文件进行比较。任何差异都将写入该文件输出/回归。差异在里面diff-c总体安排请注意,尝试运行缺少预期文件的测试将被报告为“故障”,因此请确保您拥有所有预期文件。

TAP_测试允许使用抽头测试。每次运行的数据都存在于名为tmp_检查/.另见第33.4节更多细节。

# 提示

创建预期文件的最简单方法是创建空文件,然后进行测试运行(当然会报告差异)。检查在中找到的实际结果文件结果/目录(用于中的测试)倒退),或输出/结果/目录(用于中的测试)隔离),然后复制到期待/如果他们符合你对测试的期望。