LINUX.ORG.RU
ФорумAdmin

Полученный при сборке пакет зависит от библиотеки, которую он предоставляет

 , , ,


0

1

Пытаюсь собрать Dante SOCKS сервер под CentOS и Fedora, ну и заодно разобраться со сборкой RPM-пакетов (на самом деле, это основная цель).

Для сборки использую mock, spec-файл: dante.spec.

Проблема появляется, когда я пытаюсь установить пакет dante-libs или любой пакет, который от него зависит:

# при установке через yum/dnf из copr-репозитория:
Error: Package: dante-libs-1.4.1-1.el7.centos.x86_64 (smaximov-dante)
           Requires: libsocks.so.0()(64bit)

# при установке через rpm
error: Failed dependencies:
	libsocks.so.0()(64bit) is needed by dante-libs-1.4.1-1.fc24.x86_64

Но ведь libsocks.so.0 указана в директиве %files:

## dante-libs files
%files libs
%defattr(-, root, root)

%doc README BUGS NEWS CREDITS
%license LICENSE

%{_libdir}/libdsocks.so
%{_libdir}/libsocks.so
%{_libdir}/libsocks.so.0
%{_libdir}/libsocks.so.0.1.1

Этот файл присутствует в rpm-пакете, в чём можно убедиться, распаковав пакет.

Собственно, вопросы:

  • Я так понимаю, что зависимость от libsocks.so.0 задаёт неявно rpmbuild. Как сказать, чтобы он искал этот файл в самом пакете?
  • Как с помощью mock одной командной собрать из spec-файла пакет? Я сейчас делаю так:
    $ mock -r $CONFIG --buildsrpm --spec path/to/spec --sources path/to/sources
    $ mock -r $CONFIG --copyout /builddir/build/SRPMS/$PKG.src.rpm /tmp
    $ mock -r $CONFIG --rebuild /tmp/$PKG.src.rpm
  • Возмножно ли с помощью mock/rpmbuild автоматически скачивать исходники, которые будут использоваться при сборке пакета? Про spectool знаю, это немного не то.

По вопросу зависимостей. В rpm есть такая штука, как автоматические зависимости (http://www.rpm.org/max-rpm/s1-rpm-depend-auto-depend.html - обрати внимание на последний пункт, про AutoReqProv: no). У тебя dante-server содержит бинарный файл %{_sbindir}/sockd - если сделаешь на нём ldd, то он может зависеть от библиотеки libsocks.so.0()(64bit), именно поэтому он может попадать в список зависимостей rpm.

pod ★★ ()
Ответ на: комментарий от anonymous

Она клиенту нужна, и поставляется в отдельном пакете:

Но вопрос в том, как запаковать эту либу в пакет dante-libs. Я смотрю на тот спек и не вижу отличия от моего, кроме названия подпакета (libsocks0 vs dante-libs), и это меня смущает.

Или это неправильный подход?

theNamelessOne ★★★★★ ()
Ответ на: комментарий от pod

ldd socksd я уже смотрел, нет там этой библиотеки. Да и ругается не пакет dante-server, а пакет dante-libs.

theNamelessOne ★★★★★ ()

может пакет устанавливает эту либу в такую директорию, где потом не сможет ее автоматически найти?

anonymous ()
Ответ на: комментарий от anonymous
λ nameless@desktop ~ → rpm -qlp /tmp/dante-libs-1.4.1-1.fc24.x86_64.rpm
/usr/include/socks.h
/usr/lib64/libdsocks.so
/usr/lib64/libsocks.so
/usr/lib64/libsocks.so.0
/usr/lib64/libsocks.so.0.1.1
/usr/share/doc/dante-libs
/usr/share/doc/dante-libs/BUGS
/usr/share/doc/dante-libs/CREDITS
/usr/share/doc/dante-libs/NEWS
/usr/share/doc/dante-libs/README
/usr/share/licenses/dante-libs
/usr/share/licenses/dante-libs/LICENSE
λ nameless@desktop ~ → rpm -qp --provides /tmp/dante-libs-1.4.1-1.fc24.x86_64.rpm
dante-libs = 1.4.1-1.fc24
dante-libs(x86-64) = 1.4.1-1.fc24
λ nameless@desktop ~ → rpm -qRp /tmp/dante-libs-1.4.1-1.fc24.x86_64.rpm       
libsocks.so.0()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1

socks.h там лишний, да, нужно будет убрать.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

libsocks.so.0()(64bit) у тебя почему-то попал в requires, вместо того, чтобы попасть в provides

может это из-за того, что pre/post-скрипты не разделены по суб-пакетам, т.е. попали во все три пакета, а там сервис sockd, который, наверняка, выполняет бинарь sockd, который требует либу libsocks.so

anonymous ()
Ответ на: комментарий от anonymous

libsocks.so.0()(64bit) у тебя почему-то попал в requires, вместо того, чтобы попасть в provides

Ну, это ещё со стартового сообщения было понятно :)

может это из-за того, что pre/post-скрипты не разделены по суб-пакетам, т.е. попали во все три пакета, а там сервис sockd, который, наверняка, выполняет бинарь sockd, который требует либу libsocks.so

Попробую попозже собрать пакеты по отдельности (ну или скрипты правильно расписать; я почему-то думал, что они одни на весь spec-файл, как и правила сборки).

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.