Укажите порядок сборки RPM в макете
TLDR. Обеспечьте актуальность операционной системы, чтобы обеспечить согласованность с текущими спецификационными файлами.
симптом
При перестройке PostgreSQL 11.1 SRPM используется mock
сборка завершается неудачно с:
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 $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
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)
При просмотре mock
"s installed_pkgs.log
, были установлены следующие (последний из которых я ожидаю, предоставит версию libpq
заголовки):
postgresql-libs-9.6.10-3.fc27.x86_64
postgresql-devel-9.6.10-3.fc27.x86_64
Тем не менее, я не могу найти способ установить postgresql-*
пакеты в среду chroot, которые содержат обновленные заголовки библиотеки.
Спросите
поскольку postgresql
СРПМ предполагается построить 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
1 ответ
Первый намек, вы используете последние postgresql.spec
версия, но вы пытаетесь собрать ее на довольно старой (на самом деле не поддерживаемой) версии 27 дистрибутива Fedora. Я бы посоветовал вам перейти на более новую версию Fedora или хотя бы проверить ветку f27
в том же RPM-репозитории git.
Во-вторых, мы изменили компоновку упаковки PostgreSQL в Fedora 30+. Мы вырезали библиотеку (libpq.so) в отдельный пакет для каждого объявления.
Как продолжить; всегда проверяйте соответствующую ветку в зависимости от того, против чего вы строите Fedora, и корректируйте файл спецификации соответствующим образом (проверка f27
и обновить до PostgreSQL 11.1 в этом случае).
JFTR (может помочь), уже существует тестовая модульная сборка PostgreSQL 11 против Fedora 28+, и сценарии сборки хранятся в отдельной ветке stream-postgresql-11
, Если повезет, вы сможете построить эту ветку и на старой Fedora 27. Обратите внимание, что эта версия postgresql.spec
Файл немного сложен (это должно быть потому, что мы создаем его для разных версий Fedora).