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