乐于分享
好东西不私藏

PG源码编译之内置 vs 外置方式

PG源码编译之内置 vs 外置方式

~好记性不如烂笔头~ 
~易忘之事~随笔记之~
一、pg源码内置编译(In-source Build)

1.1. 定义

在源代码目录内部直接进行编译,所有构建生成的文件都混在源代码目录中。

1.2. 典型结构

postgresql-18.0/

├── src/# 原始源代码

├── configure# 配置脚本

├── Makefile# 构建后生成的

├── *.o# 构建后生成的目标文件

├── *.so# 构建后生成的库文件

└── …# 构建产物与源代码混在一起

1.3. 操作步骤

# 1. 进入源码目录

cd postgresql-18.0

# 2. 配置(在源码目录内)

./configure –prefix=/usr/local/pgsql

# 3. 编译(在源码目录内)

make

# 4. 安装

sudo make install

1.4. 优点

     1.简单直接:不需要额外管理构建目录

     2.路径处理简单:所有路径都是相对的,不易出错

     3.传统方式:许多项目默认采用的方式

1.5. 缺点

     1.污染源码:生成文件与源代码混在一起

     2.清理困难:需要小心清理,可能误删源码

     3.版本控制混乱:git status 会显示大量无关文件

     4.不支持多配置:无法同时为不同配置构建

     5.开发者不友好:影响源代码阅读和搜索

二、pg源码外置编译(Out-of-source Build)

2.1. 定义

在源代码目录外部创建独立的构建目录,保持源代码目录干净。

2.2. 典型结构

project/

├── postgresql-18.0/# 干净的源代码目录(只读)

├── src/# 原始源代码

├── configure# 配置脚本

└── …# 其他源文件

└── build-postgresql/# 独立的构建目录

├──Makefile# 配置生成的构建文件

├──*.o# 所有构建产物

├──*.so# 库文件

└──# 只包含构建相关文件

2.3. 操作步骤

# 1. 创建独立构建目录(在源码目录外)

mkdir build-postgresql

cd build-postgresql

# 2. 使用相对或绝对路径指向源码配置脚本

../postgresql-18.0/configure –prefix=/usr/local/pgsql

# 或者使用绝对路径

# /path/to/postgresql-18.0/configure –prefix=/usr/local/pgsql

# 3. 编译(在构建目录内)

make

# 4. 安装

sudo make install

2.4. 高级外置编译示例

# 创建多个不同配置的构建目录

mkdir build-release build-debug build-coverage

# 发布版本构建

cd build-release

../postgresql-18.0/configure \

–prefix=/usr/local/pgsql-release \

–with-openssl\

–with-python

# 调试版本构建

cd../build-debug

../postgresql-18.0/configure \

–prefix=/usr/local/pgsql-debug \

–enable-debug\

–enable-cassert

2.5. 优点

     1.源码纯净:源代码目录保持干净,便于版本控制

     2.多配置支持:可同时构建不同配置(调试版、发布版等)

     3.清理简单:删除构建目录即可彻底清理

     4.开发友好:方便源代码阅读和搜索

     5.并行构建:可同时进行多个构建而不冲突

     6.便于分发:源代码可打包分发,不含构建产物

2.6. 缺点

     1.路径复杂:需要正确指向源码目录

     2.学习成本:对新手可能不够直观

     3.额外磁盘空间:需要单独的构建目录空间

三、两者对比总结

四、推荐实践

4.1. 个人开发/测试

# 使用外置编译,保持源码干净

mkdir ~/pg-build

cd ~/pg-build

/path/to/postgresql-src/configure –enable-debug

make -j$(nproc)

4.2. 持续集成(CI)环境

# CI 脚本示例

git clone https://github.com/postgres/postgres.git

mkdir build && cd build

../postgres/configure –prefix=/tmp/pg-install

make-j4

make check

4.3. 多版本测试

# 为不同版本创建不同构建目录

for version in 15 16 17 18;do

tar-xzf postgresql-$version.0.tar.gz

mkdir build-pg$version

cd build-pg$version

../postgresql-$version.0/configure –prefix=/opt/pg$version

make -j$(nproc)

sudo make install

cd..

done

4.4. 从内置编译迁移到外置编译

# 1. 清理旧的构建

cd postgresql-src

make distclean

# 2. 创建外置构建目录

mkdir ../build-pg

cd ../build-pg

# 3. 重新配置构建

../postgresql-src/configure [options]

4.5. 常见问题解决

# 如果 configure 找不到文件

# 使用绝对路径

`pwd`/../postgresql-src/configure

# 或使用相对路径(确保正确)

../../path/to/source/configure

# 检查配置是否正确

../postgresql-src/configure –help|grep prefix

4.6.  Makefile 中的支持

PostgreSQL 的构建系统原生支持外置编译,但在执行 make 命令时需要注意:

# 在外置构建目录中,这些命令正常工作

make

make check

make install

# 但有些命令可能需要指定源码目录

make -C ../postgresql-src some-target

五、结论

对于 PostgreSQL 开发者和贡献者,强烈推荐使用 外置编译,因为它:

      1.保持代码库清洁,便于版本管理

      2.支持并行多配置测试

      3.符合现代软件开发实践

对于 一次性安装或简单使用,内置编译可能更直接,但考虑到维护性和清晰性,外置编译是更专业的选择。

大多数开源项目(如 Linux kernel、CMake、LLVM)都推荐使用外置编译方式,这已成为现代 C/C++ 项目的标准实践。

写在最后

道阻且长,行则将至,与君共勉!

感谢您的光临和阅读,让我们一起学习&进步&成长。本文如有错误或不足之处,欢迎私信我,谢谢~

也欢迎您在文末 点赞、分享、推荐,给个3连击,以资鼓励,谢谢~