🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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/`。