TLDR:确保使系统操作系统保持最新,以帮助确保与当前规范文件的一致性。
症状
使用 重建 PostgreSQL 11.1 SRPMmock
时,构建失败并显示:
BUILDSTDERR: /builddir/build/BUILD/postgresql-11.1/src/bin/psql/command.c:1814 undefined reference to `PQencryptPasswordConn`
注意: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 $2}')
# ...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
库头文件加载到 chroot 环境中,以确保rpmbuild
针对libpq
包含PQencryptPasswordConn
头文件的构建(它似乎存在于构建环境之外的我的系统上):
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)
在查看mock
'sinstalled_pkgs.log
时,安装了以下内容(我希望后者会提供一个libpq
标题版本):
postgresql-libs-9.6.10-3.fc27.x86_64
postgresql-devel-9.6.10-3.fc27.x86_64
但是,我找不到将postgresql-*
软件包安装到包含更新的库头文件的 chroot 环境中的方法。
问
由于postgresql
SRPM 应该构建postgresql-devel
RPM,我认为在尝试编译之前需要在 chrootmock
中构建和安装RPM,以便后面的编译找到适当的库头(除非构建过程足够智能,可以识别当前下的新库建造)。postgresql-devel
rpmbuild
psql/command.c
我怎样才能最好地做到这一点(宁愿避免多次mock
调用从 SRPM 构建的每个 RPM 包,除非这是唯一的方法)?
请注意,我系统上的构建过程会产生多个并行编译的过程。
我也试过使用mockchain —recurse
没有成功。
系统信息
Linux 4.16.6-202.fc27.x86_64