35.16. 扩展基础设施建设

如果你正在考虑分配你的PostgreSQL的扩展模块, 为它们设置便携式编译系统相当困难。 因此PostgreSQL安装提供了一个构建 基础设施的扩展,称为PGXS,所以 这个简单的扩展模块可以在已安装的服务器上简单编译。 PGXS的主要目的是为了包含C代码的扩展, 虽然它也可以用于纯SQL扩展。 注意:PGXS不打算 作为一个通用编译系统框架,可用于构建 任何软件接口到PostgreSQL; 它只是为了简单的服务器扩展模块自动化公共建立规则。 对于更复杂的软件包,您可能需要写入自己的构建系统。

为了您的扩展使用PGXS设施, 你必须写一个简单的makefile。 在makefile中,你需要设置一些变量并且 最后包括全局PGXS makefile。 下面是一个例子,建立一个isbn_issn命名的扩展模块, 由包含一些C代码,扩展的控制文件,SQL脚本,和文本文件的共享库组成:

MODULES = isbn_issn
EXTENSION = isbn_issn
DATA = isbn_issn--1.0.sql
DOCS = README.isbn_issn

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

SCRIPTS

脚本文件(非二进制数)安装到prefix/bin

SCRIPTS_built

脚本文件(非二进制数)安装到prefix/bin, 这需要首先编译。

REGRESS

回归测试用例列表(没有后缀),参见下文。

REGRESS_OPTS

另外切换到pg_regress

EXTRA_CLEAN

make clean中删除额外文件

PG_CPPFLAGS

被添加到CPPFLAGS

PG_LIBS

被添加到PROGRAM连接线

SHLIB_LINK

被添加到MODULE_big连接线

PG_CONFIG

为了PostgreSQL安装编译其路径指向pg_config 应用程序(通常pg_config使用你的PATH中的第一个)。

把这个makefile作为Makefile放在持有你的扩展的目录中。 然后你可以执行make编译, 然后make install安装模块。默认情况下,为PostgreSQL对应于 你的PATH中找到的第一个pg_config程序扩展被 编译安装。你可以通过设置PG_CONFIG指向 pg_config程序来使用一个不同的安装, 或者在makefile中或在make命令行上。

小心

当编译PostgreSQL 8.3或更高版本时, 改变PG_CONFIG。老版本不工作设置它除了pg_config; 你必须改变你的PATH来选择编译安装。

REGRESS变量中列出的脚本用于 你的模块的回归测试,这可以在执行make install之后通过 make installcheck调用。 为了可以运行你必须有一个运行的PostgreSQL服务器。 在REGRESS中的脚本文件必须出现在您的扩展目录中的sql/ 命名的子目录中。这些文件必须有扩展.sql, 这没有包含在makefile列出的REGRESS中。 每个测试还应在expected/命名的子目录中包含一个预期的输出文件, 以及相同的词干和扩展.outmake installcheck执行每个psql的测试脚本, 并且比较结果输出到匹配期望的文件。 任何差异会写入diff -c格式的文件regression.diffs中。 请注意,试图运行一个测试,缺少预期的文件将被作为"问题"报告, 所以确保你有所有预期的文件。

提示: 创造期望文件的最简单的方法是创建空文件, 然后做一个测试运行(这当然会报告差异)。检查 在results/目录中发现的实际结果文件,如果匹配从这个试验中你期望的, 那么将它们复制到expected/