Укажите порядок сборки 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).

Другие вопросы по тегам