在 mock 中指定 RPM 构建顺序

Specify RPM build order in mock

TLDR:确保保留系统 OS up-to-date 以帮助确保与当前规范文件的一致性。

症状

使用 mock 重建 PostgreSQL 11.1 SRPM 时,构建失败并显示:

BUILDSTDERR: /builddir/build/BUILD/postgresql-11.1/src/bin/psql/command.c:1814 undefined reference to `PQencryptPasswordConn`

NB: PQencryptPasswordConn 是一个 libpq.so 函数(由 postgresql-devel-10.3-5.fc27.x86_64 在我的系统上提供...在模拟 chroot 环境之外) .除非我弄错了,否则 Postgresql SRPM 会与其他人一起构建 postgresql-devel RPM。

重现步骤

我运行以下重建 SRPM ,然后 尝试应用 SRPM 中尚未存在的任何补丁:

# Obtain SRPM source
git clone https://src.fedoraproject.org/rpms/postgresql.git
cd postgresql

# Download local copies of SRPM sources
wget $(spectool -S *.spec | awk '/^Source.*:\/\//{IFS=" "; print }')
# ...check SHAs of downloaded sources...

# Run SRPM-specific prep scripts
./generate-pdf.sh
./generate-sources.sh

# Generate the SRPM
mock --root=fedora-27-x86_64 --resultdir="./SRPMS" --buildsrpm --spec postgresql.spec --sources .

# >>> Everything seems to work fine up to this point <<<

# Build the RPM inside mock chroot
mock --root=fedora-27-x86_64 --rebuild ./SRPMS/postgresql-11.1-4.fc27.src.rpm

# !!! Fail here (with symptom above) !!!

问题

到目前为止,我无法让 mock 将适当的 libpq 库 header 加载到 chroot 环境中,以确保 rpmbuild 针对 libpq 包含 PQencryptPasswordConn header(它似乎存在于构建环境之外的我的系统中):

grep -lr "PQencryptPasswordConn" /usr/include
# /usr/include/libpq-fe.h

grep -lr "PQencryptPasswordConn" /var/lib/mock/fedora-27-x86_64/root/usr/include
# (Nothing returned)

在查看 mockinstalled_pkgs.log 时,安装了以下软件(我希望后者会提供 libpq headers 的版本):

postgresql-libs-9.6.10-3.fc27.x86_64
postgresql-devel-9.6.10-3.fc27.x86_64

但是,我找不到将 postgresql-* 软件包安装到包含更新库 headers 的 chroot 环境中的方法。

提问

因为 postgresql SRPM 应该构建 postgresql-devel RPM,我认为 mock 需要在 [= 之前​​在 chroot 中构建和安装 postgresql-devel RPM 22=] 尝试编译 psql/command.c 以便后面的编译找到合适的库 headers(除非构建过程足够智能以识别当前正在构建的新库)。

我怎样才能最好地完成此任务(我希望避免对从 SRPM 构建的每个 RPM 包进行多次 mock 调用,除非那是唯一的方法)?

请注意,我系统上的构建过程会生成多个进程以进行并行编译。

我也试过 mockchain —recurse 没有成功。

系统信息

Linux 4.16.6-202.fc27.x86_64

第一个提示,您使用最新的 postgresql.spec 版本,但您尝试针对相当旧的(实际上现在不受支持)版本 27 的 Fedora 发行版构建它。我鼓励您迁移到更新版本的 Fedora,或者至少检查同一 RPM git 存储库中的分支 f27

第二个提示,我们更改了Fedora 30+ 中PostgreSQL 打包的布局。根据 announcement.

,我们已将库 (libpq.so) 切割成单独的包

如何继续;始终根据您构建的 Fedora 签出适当的分支,并适当调整规范文件(在这种情况下签出 f27 并更新到 PostgreSQL 11.1)。

JFTR(可能有帮助),已经有针对 Fedora 28+ 的 PostgreSQL 11 的 testing 模块化构建,构建脚本在单独的 branch stream-postgresql-11。运气好的话,您也可以针对旧的 Fedora 27 构建该分支。请注意,此版本的 postgresql.spec 文件有点复杂(这是因为我们针对不同版本的 Fedora 构建它)。