PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 35. 扩展SQL | 下一页

# 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`命令行上。

如果你想要保持编译目录独立， 你也可以在你的扩展的源码树外面的一个目录里面运行`make`。 这个过程也叫做VPATH 编译。下面是如何做：

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

可选的，你可以以一种和内核代码相似的方式为VPATH编译设置目录。 一种方式是使用内核脚本`config/prep_buildtree`。 一旦做了这个，你可以像下面这样通过设置`make`变量 `VPATH`来编译：

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

这个过程支持更多类型的目录格式。

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

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

上一页 | 起始页 | 下一页
包装相关对象到一个扩展 | 上一级 | 触发器