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
命令行上。
Caution |
---|
当编译PostgreSQL 8.3或更高版本时, 改变PG_CONFIG 。老版本不工作设置它除了pg_config ; 你必须改变你的PATH 来选择编译安装。 |
在REGRESS
变量中列出的脚本用于 你的模块的回归测试,这可以在执行make install
之后通过 make installcheck
调用。 为了可以运行你必须有一个运行的PostgreSQL服务器。 在REGRESS
中的脚本文件必须出现在您的扩展目录中的sql/
命名的子目录中。这些文件必须有扩展.sql
, 这没有包含在makefile列出的REGRESS
中。 每个测试还应在expected/
命名的子目录中包含一个预期的输出文件, 以及相同的词干和扩展.out
。 make installcheck
执行每个psql的测试脚本, 并且比较结果输出到匹配期望的文件。 任何差异会写入diff -c
格式的文件regression.diffs
中。 请注意,试图运行一个测试,缺少预期的文件将被作为"问题"报告, 所以确保你有所有预期的文件。
Tip: 创造期望文件的最简单的方法是创建空文件, 然后做一个测试运行(这当然会报告差异)。检查 在
results/
目录中发现的实际结果文件,如果匹配从这个试验中你期望的, 那么将它们复制到expected/
。