PostgreSQL 9.3.1 中文手册 | ||||
---|---|---|---|---|
Prev | Up | Chapter 35. 扩展SQL | Next |
如果你正在考虑分配你的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 规则。
设置这三个变量之一指定建立什么:
从源文件同一地方编译共享库对象列表(不包括列表中的库后缀)
从多个源文件构建共享库(在OBJS中列出对象文件)
建立可执行程序(在OBJS中列出对象文件)
下面的变量也可以设置:
扩展名:对于每一个名字你必须提供一个extension.control 文件,它将被安装到prefix/share/extension中。
DATA和DOCS文件应该被安装到prefix/share 子目录中(如果没有设置,如果设置EXTENSION, 缺省是extension。如果没有则为contrib)。
随机文件安装到prefix/share/$MODULEDIR。
随机文件安装到prefix/share/$MODULEDIR, 这首先需要编译。
随机文件安装到prefix/share/tsearch_data中。
随机文件安装到prefix/doc/$MODULEDIR
脚本文件(非二进制数)安装到prefix/bin中
脚本文件(非二进制数)安装到prefix/bin, 这需要首先编译。
回归测试用例列表(没有后缀),参见下文。
另外切换到pg_regress
make clean中删除额外文件
被添加到CPPFLAGS
被添加到PROGRAM连接线
被添加到MODULE_big连接线
为了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/。