创建一个独立的、可重定位的 postgres 构建

Creating a standalone, relocatable build of postgres

对于我正在进行的一个小项目,我想创建一个 PostgreSQL 的“可重定位构建”,类似于二进制文件 here。这个想法是你已经打包了 PostgreSQL 和所有需要的库,这样你就可以在任何机器上的任何目录中解压它,它将 运行。我希望生成的 Postgres 构建 几乎可以在任何 Linux 机器 上运行。

到目前为止,我已经确定了我需要构建哪些库:

我的理解是我应该获取这些库(及其依赖项)的源代码并静态编译它们。

就目前的情况而言,my build script 非常准系统,显然会生成一个与 运行 上的任何发行版相关联的安装:

./configure \
  --prefix="${outputDir}" \
  --with-uuid="ossp"

我想知道是否有人可以概述我必须采取哪些步骤才能获得我想要的可重定位版本。我现在的直觉是,我正在寻找关于 environment variables I would need to set and/or parameters 我需要为我的构建提供什么的指导,以便最终得到一个完全可重定位的 Postgres 构建。

请注意:我通常不使用 C/C++,尽管我有几年的 ./configuremake 并为其他很多东西做构建我领导下的更高层次的生态系统。 我很清楚 Postgres 的特定发行版广泛可用,更不用说官方 docker 容器了。请采取我本着研究或探索的精神追求概念的方法。我正在寻找一个精确的解决方案,而不是一个快速的解决方案。

此答案适用于 Linux;这将在不同的操作系统上以不同的方式工作。

如果使用适当的“运行 路径”构建 PostgreSQL,则可以创建“可重定位构建”。 The documentation 给你这些提示:

The method to set the shared library search path varies between platforms, but the most widely-used method is to set the environment variable LD_LIBRARY_PATH [...]

On some systems it might be preferable to set the environment variable LD_RUN_PATH before building.

ld 的手册告诉您:

If -rpath is not used when linking an ELF executable, the contents > of the environment variable LD_RUN_PATH will be used if it is defined.

它还告诉您有关 运行 路径的信息:

The tokens $ORIGIN and $LIB can appear in these search directories. They will be replaced by the full path to the directory containing the program or shared object in the case of $ORIGIN and either lib - for 32-bit binaries - or lib64 - for 64-bit binaries - in the case of $LIB.

另见

因此步骤顺序为:

./configure --disable-rpath [other options]
export LD_RUN_PATH='$ORIGIN/../lib'
make
make install

然后将 PostgreSQL 二进制文件打包到 bin 子目录中,并将共享库以及所有必需的库(您可以通过 ldd 找到它们)打包到 lib 子目录中。然后将相对于二进制文件查找库。