Автор Тема: Вопрос по сборке пакета с помощью rpmbuild  (Прочитано 9999 раз)

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Решил понемногу освоить сборку пакетов. Все извращения провожу на виртуалбокс. Для начала хочу освоить  обычный rpmbuild.
Установил все плюшки и в качестве теста собрал src.rpm из репозитория. Все нормально. Поскольку я извращенец, то решил собрать программу которой нет в репах с нуля, то есть вообще с нуля.
Hasher и git пока не предлагать.

Итак:
Скачал исходники.

Начал писать файл спецификации. В начале он был довольно простым сделанный по шаблону из викиалт и просмотра образцов из веб репов ( кстати они там все по разному оформлены ).
Постепенно спек стал чуть сложнее и приобрел такую форму:
Name: mountmanager
Version: 0.2.6
Release: alt1

Summary: Manager mount devices.
License: GPLv2+
Group: Archiving/Other
Url: https://code.google.com/p/linuxtuner/
Source0: http://linuxtuner.googlecode.com/files/mountmanager-0.2.6.tar.gz
Source1: mountmanager.desktop
Patch0: %{name}-config-destination.patch
Packager: Koi Evgeniy <mistor-klimaks@yandex.ru>

Requires: qt4
Requires: hal

BuildRequires: libqt4-devel
BuildRequires: libqt4-core
BuildRequires: libqt4-gui
BuildRequires: libqt4-dbus
BuildRequires: libqt4-xml

%description
The basic functionalities of MountManager are:

Mount and unmount partitions (ext3/2, ntfs, swap, fat, reiserfs, iso9660, udf, ...)
Show all logical and physical disks
Change config file /etc/fstab
Descriptions of options and other settings of mounting
Restoration system
Images mounting and unmounting (Nrg, Mdf , Ccd, Bin , etc)
Udev rules creation
Disk wizard
Etc... Plugins are supported and there is good English and Russian documentations to help develop new plugins.


%prep
%setup -q
%patch0 -p1

%build
./configure --lib_path=%{_libdir} --prefix=/usr/src/RPM/tmp/
%make

%install
%makeinstall_std

%files
%defattr
%doc license readme.en readme.ru
%doc %{_datadir}/doc/MountManager/*
%{_bindir}/mmanager
%{_bindir}/mm
%{_libdir}/mountmanager/plugins/libdocumentationpanel.so
%{_libdir}/mountmanager/plugins/libfstabpreview.so
%{_libdir}/mountmanager/plugins/libimagesmounting.so
%{_libdir}/mountmanager/plugins/libsharesmount.so
%{_libdir}/mountmanager/plugins/libtips.so
%{_libdir}/mountmanager/trans/br.qm
%{_libdir}/mountmanager/trans/docpanel_ru.qm
%{_libdir}/mountmanager/trans/es.qm
%{_libdir}/mountmanager/trans/imagesmount_ru.qm
%{_libdir}/mountmanager/trans/pl.qm
%{_libdir}/mountmanager/trans/previewpanel_ru.qm
%{_libdir}/mountmanager/trans/pt.qm
%{_libdir}/mountmanager/trans/ru.qm
%{_libdir}/mountmanager/trans/sharesmount_ru.qm
%{_libdir}/mountmanager/trans/tips_ru.qm
%{_libdir}/mountmanager/trans/tr.qm
%{_datadir}/applications/mountmanager-kde.desktop
%{_datadir}/applications/mountmanager-gtk.desktop
%{_datadir}/icons/mm.png
%{_mandir}/man1/mm.1*
%{_mandir}/man1/%{name}.1*
%{_datadir}/%{name}/*

Результат запуска rpmbuild -bi такой:
+---------------------------------------------------------------------+
|               OK. Start the program by typing mm                  |
+---------------------------------------------------------------------+
make: Leaving directory `/usr/src/RPM/BUILD/mountmanager-0.2.6'
+ /usr/lib/rpm/brp-alt
/usr/lib/rpm/brp-alt: line 26: cd: /tmp/.private/rupor/mountmanager-buildroot: No such file or directory
ошибка: Неверный код возврата из /tmp/.private/rupor/rpm-tmp.70468 (%install)


Ошибки сборки пакетов:
    Неверный код возврата из /tmp/.private/rupor/rpm-tmp.70468 (%install)

cd: /tmp/.private/rupor/mountmanager-buildroot: No such file or directory
Собственно да, перейти в эту папку нельзя, так как ее нету. Я пробовал ее создавать сам, но в процессе сборки он ее удаляет, а свою не создает.

Весь лог сборки.
Что не так?

Бредни
Спойлер
В /usr/lib/rpm/brp-alt:
cd "$RPM_BUILD_ROOT"
Есть идея задать путь BuildRoot в спец, но результат точно такой же, путь игнорирует. Можно строчку RPM_BUILD_ROOT заменить на свою.
Если в спец игнорируется buildroot, то где лежит базовое значение?
Извращенческих идей много, но хочется исправить по культурному.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Замените
./configure --lib_path=%{_libdir} --prefix=/usr/src/RPM/tmp/
на
%configure

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
%{_bindir}/mmanager - скобки писать не надо - %_bindir/mmanager
%doc %{_datadir}/doc/MountManager/* - скорей всего достаточно %doc doc/MountManager/*

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Используйте для убирания лишнего
cleanup_spec spec-файл
« Последнее редактирование: 29.12.2014 07:22:18 от ruslandh »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 926
    • Домашняя страница
    • Email
В Requires оставить hal (в Альте автозависимости генерятся), в BuildRequires: gcc-c++ qt4-devel
Андрей Черепанов (cas@)

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
Что не так?

Не так, в основном, это:
Source0: http://linuxtuner.googlecode.com/files/mountmanager-0.2.6.tar.gz
Source1: mountmanager.desktop
...
%setup -q

Из описания спека в ALT Wiki можно сделать вывод, что у setup только два параметра — -q и -v (кстати, применительно к сборке эти параметры ни о чём). И ни одной буквы не написано, что сиих параметров как бы немного больше и setup без дополнительных указаний переносит в каталог BUILD только Source0. О чем компилятор радостно сообщает через часок-другой натужного пыхтения, прерывая сборку, поскольку не находит нужных файлов.

Должно быть так:
%setup -a 1
Правда тут ещё надо посмотреть туда ли попадает впихуемый таким образом файл.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Не так, в основном, это:
Source0: http://linuxtuner.googlecode.com/files/mountmanager-0.2.6.tar.gz
Source1: mountmanager.desktop
...
%setup -q
Почему не так ? Всё нормально.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
/tmp/.private/rupor/mountmanager-buildroot
Непонятно, откуда взялся такой buildroot и почему он не создался, если он такой. Что в ~/.rpmmacros ? Хотя, если там $TMP, или $TMPDIR, это препятствием быть не должно.

Про configure замечание верное - без тяжёлых случаев лучше макрос использовать.

Кстати, был в ALT когда-то мантейнер rupor. Давно, правда, это забросил.
« Последнее редактирование: 03.01.2015 12:43:17 от asy »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
%{_bindir}/mmanager - скобки писать не надо - %_bindir/mmanager
Скобки не мешают, тут, главное, обнообразие (для читабельности). Бывают случаи, когда без скобок никак, тогда красивее, когда они везде. :-)

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 9 000
%{_bindir}/mmanager - скобки писать не надо - %_bindir/mmanager
Скобки не мешают, тут, главное, обнообразие (для читабельности). Бывают случаи, когда без скобок никак, тогда красивее, когда они везде. :-)
Ага, например без скобок никак в спеке, с которым вчера разбирался. Всё остальное от скобок избавлено (ну, привычнее мне без них, читабельнее спек), как избавлено и от лишнего, с точки зрения местной сборочной системы, мусора.
Спойлер
%define  releasedate 20140916
%define  relnumber   9000

Name: yacy
Version: 1.80
Release: alt2
Summary: P2P Search Engine, Web-Crawler and Proxy
License: GPL2
Group: Networking
Url: http://yacy.net/release/yacy_v%{version}_%{releasedate}_%{relnumber}.tar.gz
BuildArch: noarch

Source: yacy_v%{version}_%{releasedate}_%{relnumber}.tar.gz
Source1: yacy.init

BuildRequires: /proc
BuildRequires: ant
Requires: java >= 1.7.0

%description
YaCy is a Java-based peer-2-peer search engine.

It provides a personal websearch engine, which is free and decentral. The
search index is distributed over a peer2peer network. It contains a crawler,
an indexer and its own database engine. In robinson-modus, yacy can be
used for a topic-oriented search portal or to index an intranet.

Also included in YaCy is a Wiki, a P2P-message-system, a Blog and a bookmark
management system.

%prep
%setup -q -n yacy
sed -i 's/\r//' readme.txt
# Fix FSF address
sed -i 's/59 Temple Place, Suite 330, Boston, MA  02111-1307  USA/51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA/' COPYRIGHT
pushd htroot
JFILES=$(find . -name '*.java' -print)
for file in $JFILES ; do
    sed -i 's/59 Temple Place, Suite 330, Boston, MA  02111-1307  USA/51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA/' $file
done
popd

%build

%install
ant installonlinux -DDESTDIR=%buildroot
mkdir -p %buildroot%_datadir/java/yacy/
cp lib/*.jar %buildroot%_datadir/java/yacy/

# Do not install these binary scripts
rm -rf %buildroot%_datadir/yacy/bin

# location for init-script
mkdir -p %buildroot/etc/rc.d/init.d/
install -m 755 %SOURCE1 %buildroot/etc/rc.d/init.d/yacy
install -d -m 0755 %buildroot%_sbindir
ln -s %_sysconfdir/init.d/%name %buildroot%_sbindir/%name

# create dummy directories and files
mkdir -p %buildroot/var/log/yacy
mkdir -p %buildroot%_datadir/yacy/DATA
mkdir -p %buildroot/etc/yacy
mkdir -p %buildroot/var/lib/yacy/LOG

%pre
%_sbindir/groupadd -r -f _%name ||:
%_sbindir/useradd -r -g _%name -d /usr/share/yacy -s /dev/null -n _%name 2> /dev/null > /dev/null ||:
#chown -R _yacy:root /var/lib/yacy

%post
%post_service %name

%preun
%preun_service %name

%files
%dir %attr (755,_yacy,root) /var/lib/yacy
%attr (755,_yacy,root) /var/lib/yacy/LOG
%ghost %config %dir /var/lib/yacy/SETTINGS
/etc/rc.d/init.d/yacy
%dir %_datadir/%name
%_datadir/java/yacy
%_datadir/%name/defaults
%_datadir/%name/htroot
%_datadir/%name/langstats
%_datadir/%name/locales
%_datadir/%name/skins
%_datadir/%name/yacy.badwords.example
%_datadir/%name/yacy.stopwords
%_datadir/%name/yacy.yellow
%doc /usr/share/doc/yacy
%_sbindir/%name
/etc/yacy
/var/log/yacy
%_datadir/%name/DATA

%changelog
Для сравнения сузеводческий оригинал (избавленный разве что от чейнджлога, для наглядности), взятый отсюда http://forum.altlinux.org/index.php/topic,8027.msg243454.html#msg243454:
Спойлер
#
# spec file for package yacy
#
# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# norootforbuild

# Author: Michael Benz <michaelbenz@gmx.net>
# previous Author: Florian Richter <Florian_Richter@gmx.de>, Franz Brausse <mike-nought@gmx.de>
#
# Date: 18.01.2012
# Based on previous spec files found in OBS
# Distributed under the terms of the GNU General Public License v2

%define  releasedate 20130613
%define  relnumber   9000

Summary:      P2P search engine, web-crawler and proxy
Name:         yacy
Version:      1.5
Release:      3.1
License:      GPL-2.0
Group:         Productivity/Networking/Web/Utilities
Source:         yacy_v%{version}_%{releasedate}_%{relnumber}.tar.bz2
URL:                    http://yacy.net/release/yacy_v%{version}_%{releasedate}_%{relnumber}.tar.gz
#####
PreReq:         sudo
PreReq:         coreutils
PreReq:         grep
PreReq:         sed
%if 0%{?suse_version}
PreReq:         pwdutils
%endif
%if 0%{?fedora_version}
Requires(post):      fedora-usermgmt
%endif
%if 0%{?suse_version}
PreReq:         diffutils
PreReq:         %fillup_prereq
%endif
%if 0%{?fedora_version}
Requires(post):      chkconfig
Requires(preun):   chkconfig
Requires(preun):   initscripts
%endif
%if 0%{?mandriva_version}
Requires(pre):      rpm-helper
%endif
#####
Requires:      wget
%if 0%{?suse_version}
Requires:      java >= 1.6.0
%endif
%if 0%{?mandriva_version}
Requires:      java-1.6.0-sun
%endif
%if 0%{?fedora_version}
Requires:      java >= 1.5.0
%endif

BuildRequires:      fdupes
BuildRequires:      m4
BuildRequires:      ant ant-apache-regexp ant-nodeps
%if 0%{?suse_version}
BuildRequires:      java >= 1.6.0
BuildRequires:          java-devel >= 1.6.0
%endif
%if 0%{?mandriva_version}
BuildRequires:      java-devel >= 1.5.0
BuildRequires:      geronimo-jaf-1.0.2-api
%endif
%if 0%{?fedora_version}
BuildRequires:      java-1.6.0-openjdk-devel
%endif
BuildArch:      noarch
BuildRoot:      %{_tmppath}/%{name}-%{version}-build

%description
YaCy is a Java-based peer-2-peer search engine.

It provides a personal websearch engine, which is free and decentral. The
search index is distributed over a peer2peer network. It contains a crawler,
an indexer and its own database engine. In robinson-modus, yacy can be
used for a topic-oriented search portal or to index an intranet.

Also included in YaCy is a Wiki, a P2P-message-system, a Blog and a bookmark
management system.

%prep
%setup -q -n yacy
sed -i 's/\r//' readme.txt
# Fix FSF address
sed -i 's/59 Temple Place, Suite 330, Boston, MA  02111-1307  USA/51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA/' COPYRIGHT
pushd htroot
JFILES=$(find . -name '*.java' -print)
for file in $JFILES ; do
    sed -i 's/59 Temple Place, Suite 330, Boston, MA  02111-1307  USA/51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA/' $file
done
popd

%build
# ant clean all
%if 0%{?suse_version}
m4 -DopenSUSE addon/yacyInit.m4 | sed -e '12 d' >yacy.init
%endif
%if 0%{?fedora_version}
m4 -DFedora addon/yacyInit.m4 >yacy.init
%endif
%if 0%{?mandriva_version}
m4 -DMandriva addon/yacyInit.m4 >yacy.init
%endif

%install
%ant installonlinux -DDESTDIR=%{buildroot}
mkdir -p %{buildroot}/usr/share/java/yacy/
cp lib/*.jar %{buildroot}/usr/share/java/yacy/
#__install -m 644 defaults/yacy.logging {buildroot}/usr/share/yacy/

# Do not install these binary scripts
rm -rf %{buildroot}/usr/share/yacy/bin

# location for init-script
%if 0%{?fedora_version} || 0%{?mandriva_version}
mkdir -p %{buildroot}/etc/rc.d/init.d/
install -m 755 yacy.init %{buildroot}/etc/rc.d/init.d/yacy
%else
mkdir -p %{buildroot}/etc/init.d/
install -m 755 yacy.init %{buildroot}/etc/init.d/yacy
%endif
%{__install} -d -m 0755 %{buildroot}%{_sbindir}
%{__ln_s} -f %{_sysconfdir}/init.d/%{name} %{buildroot}%{_sbindir}/rc%{name}
%fdupes -s %{buildroot}/

%pre
# check whether group 'yacy' already exists, if not it will be created
if ! getent group yacy >> /dev/null; then
   echo "adding group yacy"
   groupadd -r yacy
fi
# check whether user 'yacy' already exists, if not it will be created
if ! getent passwd yacy > /dev/null; then
   echo "adding user yacy"
   useradd yacy -r -g yacy -d /usr/share/yacy
fi

%post
chown yacy -R /var/lib/yacy
%if 0%{?suse_version}
%{fillup_only}
%endif
%if 0%{?fedora_version}
# This adds the proper /etc/rc*.d links for the script
/sbin/chkconfig --add yacy
%endif
%if 0%{?mandriva_version}
%_post_service yacy
%endif

%preun
%if 0%{?suse_version}
%stop_on_removal yacy
%endif
%if 0%{?fedora_version} || 0%{?mandriva_version}
if [ $1 = 0 ] ; then
    /sbin/service yacy stop >/dev/null 2>&1
    /sbin/chkconfig --del yacy
fi
%endif
%if 0%{?mandriva_version}
%_preun_service yacy
%endif

%postun
%if 0%{?suse_version}
%restart_on_update yacy
%insserv_cleanup
%endif
%if 0%{?fedora_version} || 0%{?mandriva_version}
if [ "$1" -ge "1" ] ; then
    /sbin/service yacy restart >/dev/null 2>&1 || :
fi
%endif
# Leave user on the system...
#if [ `getent passwd yacy` ]; then userdel yacy &> /dev/null; fi

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(644,root,root,755)
%dir /var/lib/yacy/
%ghost %config %dir /var/lib/yacy/SETTINGS
%if 0%{?fedora_version} || 0%{?mandriva_version}
%config %attr (755,root,root) /etc/rc.d/init.d/yacy
%else
%attr (755,root,root) %{_sysconfdir}/init.d/yacy
%endif
%dir /var/log/yacy/
/usr/share/java/yacy
/usr/share/yacy/defaults
/usr/share/yacy/htroot
%dir /usr/share/yacy/DATA
/usr/share/yacy/langstats/
/usr/share/yacy/locales
#/usr/share/yacy/ranking
/usr/share/yacy/skins
/usr/share/yacy/yacy.badwords.example
#/usr/share/yacy/yacy.logging
/usr/share/yacy/yacy.stopwords
/usr/share/yacy/yacy.yellow
%dir /usr/share/yacy
%dir /etc/yacy
%doc /usr/share/doc/yacy
%{_sbindir}/rc%{name}

%changelog

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Из rpm --showrc

/etc/rc.d/init.d =  _initdir =  %{_sysconfdir}/rc.d/init.d
/etc  =  _sysconfdir
%{_var}/log = _logdir


Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 251
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Вот тут написано много:
http://www.altlinux.org/ALT_Packaging_HOWTO


Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
Не так, в основном, это:
Source0: http://linuxtuner.googlecode.com/files/mountmanager-0.2.6.tar.gz
Source1: mountmanager.desktop
...
%setup -q
Почему не так ? Всё нормально.
Потому, что в этом случае Source1 игнорируется. Что хорошо видно в приведённом логе сборки. Сам на эту граблю наступал.
« Последнее редактирование: 03.01.2015 17:34:56 от stranger573 »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 104
Потому, что в этом случае Source1 игнорируется.
С чего бы ? Source1 может использоваться, как переменная. Так часто делается. Например:
cp -f %{SOURCE1} %{buildroot}%{_datadir}/applications
И использование, или неиспользование - это никак не повод ругаться на каталог.

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
С чего бы ?
С того, что это нормальное поведение скрипта setup. Посмотрите лог, там после обработки Source0 сразу следует применение патча.

Source1 может использоваться, как переменная. Так часто делается.
Может. Да, делается. Только не в этом случае. Тут он подсовывает свой десктоп-файл.

И использование, или неиспользование - это никак не повод ругаться на каталог.
Кто его знает, что у него в патче? Если есть явное указание и патч наложен — будет ругань и на каталог.