TLDR: обязательно обновляйте системную ОС, чтобы обеспечить согласованность с текущими файлами спецификаций.
Симптом
При перестроении SRPM PostgreSQL 11.1 с использованием mock
сборка завершается с ошибкой:
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)
При просмотре installed_pkgs.log
mock
было установлено следующее (последний из которых, я ожидаю, предоставит версию заголовков 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, я думаю, что mock
потребуется собрать и установить postgresql-devel
RPM в chroot, прежде чем rpmbuild
попытается скомпилировать psql/command.c
, чтобы последняя компиляция нашла соответствующие заголовки библиотек (если только процесс сборки не будет достаточно интеллектуальным). для определения новых библиотек, находящихся в стадии сборки).
Как мне лучше всего это сделать (я бы предпочел избегать нескольких вызовов mock
для каждого пакета RPM, созданного из SRPM, если только это не единственный путь)?
Обратите внимание, что процесс сборки в моей системе порождает несколько процессов для параллельных компиляций.
Я также безуспешно пытался использовать mockchain —recurse
.
Информация о системе
Linux 4.16.6-202.fc27.x86_64
postgresql-*
для выполнения сборки ... - person Whee   schedule 11.02.2019