Автор Тема: Научите меня, пожалуйста, составлять файл spec  (Прочитано 27257 раз)

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
Научите. Или подскажите: где этому учат? Знаний об этом, как я полагаю у меня 0 абсолютный. Любая строчка, ну хоть эта:
%install
install -p -D -m755 devtools/ngpbench %buildroot%_bindir/ngpbench
мне ни о чём не говорит.  Вообще, даже намёка на что-то не улавливаю...
Английский язык я не знаю.

Drool

  • Гость
Тут рядом Миша Шигорин давал ссылки:
http://forum.altlinux.org/index.php/topic,872.msg13705.html#msg13705

Оффлайн dottedmag

  • /usr/sbin/control
  • *******
  • Сообщений: 235
Debian Lenny

Оффлайн raorn

  • alt linux team
  • ***
  • Сообщений: 42
  • I'm not fat, I'm big boned!
Я использую Сизиф и я бородат.

Drool

  • Гость
http://www.rpm.org/max-rpm/

Товарищ же сказал - аглицким не владеет. Вот тут на русском: http://www.lexpr.ru/node/11

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
http://www.rpm.org/max-rpm/

Товарищ же сказал - аглицким не владеет. Вот тут на русском: http://www.lexpr.ru/node/11

Да, сроду мне тут не разобраться. Поизучайте спеки, посравнивайте. Ничего общего в них нету. Правда, у меня получилось составить спек для lmms-extras  и собрать пакет. А вот с попыткой собрать элементарную библиотеку animorph для makehuman дела обстоят отвратительно. У меня был разархивированный пакет. Я его опять заархивировал в tar.bz2, положил в SOURCES. Составил спек:

Цитировать
Name: animorph
Version: 0.3
Release: alt0

Summary: libanimorph
License: GPL
Group: Graphic
Url: http://makehuman.sourceforge.net

Packager: LanuHum <LanuHum@yandex.ru>
Source: %name-%version.tar.bz2

BuildPreReq: rpm-build
# Automatically added by buildreq on Mon Dec 15 2008
BuildRequires: make gcc-c++

%description
Library for MakeHuman

%prep
%setup -q

%build
%configure

%make

%install
rm -rf %{buildroot}
%makeinstall

%find_lang %name




%files -f %name.lang
%doc AUTHORS ChangeLog README TODO
%_libdir/%name/
%_datadir/%name/

%changelog
* Wed Dec 17 2008 LanuHum <LanuHum@yandex.ru> 0.3-alt0
- Fix build in x86_64.
И вот, что оно мне написало:
Цитировать
[lanuhum@localhost ~]$ rpmbuild -bb /home/lanuhum/RPM/SPECS/animorph.spec
Выполняется(%prep): /bin/sh -e /home/lanuhum/tmp/rpm-tmp.6421
+ umask 022
+ /bin/mkdir -p /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ rm -rf animorph-0.3
+ echo 'Source #0 (animorph-0.3.tar.bz2):'
Source #0 (animorph-0.3.tar.bz2):
+ /bin/bzip2 -dc /home/lanuhum/RPM/SOURCES/animorph-0.3.tar.bz2
+ /bin/tar -xf -
+ cd animorph-0.3
+ /bin/chmod -c -Rf u+rwX,go-w .
+ exit 0
Выполняется(%build): /bin/sh -e /home/lanuhum/tmp/rpm-tmp.56821
+ umask 022
+ /bin/mkdir -p /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ cd animorph-0.3
+ CFLAGS='-pipe -Wall -O2'
+ export CFLAGS
+ CXXFLAGS='-pipe -Wall -O2'
+ export CXXFLAGS
+ FFLAGS='-pipe -Wall -O2'
+ export FFLAGS
+ export lt_cv_deplibs_check_method=pass_all
+ lt_cv_deplibs_check_method=pass_all
+ '[' -f configure.ac -o -f configure.in ']'
+ libtoolize --copy --force
You should update your `aclocal.m4' by running aclocal.
+ ./configure --build=x86_64-alt-linux --host=x86_64-alt-linux --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/lib --localstatedir=/var/lib --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --without-included-gettext
/home/lanuhum/tmp/rpm-tmp.56821: line 101: ./configure: Permission denied
ошибка: Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.56821 (%build)


Ошибки сборки пакетов:
    Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.56821 (%build)
[lanuhum@localhost ~]$

Я подумал, что может быть в разархивированной папке что-то уже нарушено было. Нашёл исходный архив tar.gz, исправил это в спеке, и вот что оно мне опять написало:
Цитировать
[lanuhum@localhost ~]$ rpmbuild -bb /home/lanuhum/RPM/SPECS/animorph.spec
Выполняется(%prep): /bin/sh -e /home/lanuhum/tmp/rpm-tmp.30634
+ umask 022
+ /bin/mkdir -p /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ rm -rf animorph-0.3
+ echo 'Source #0 (animorph-0.3.tar.gz):'
Source #0 (animorph-0.3.tar.gz):
+ /bin/gzip -dc /home/lanuhum/RPM/SOURCES/animorph-0.3.tar.gz
+ /bin/tar -xf -
+ cd animorph-0.3
+ /bin/chmod -c -Rf u+rwX,go-w .
+ exit 0
Выполняется(%build): /bin/sh -e /home/lanuhum/tmp/rpm-tmp.30634
+ umask 022
+ /bin/mkdir -p /home/lanuhum/RPM/BUILD
+ cd /home/lanuhum/RPM/BUILD
+ cd animorph-0.3
+ CFLAGS='-pipe -Wall -O2'
+ export CFLAGS
+ CXXFLAGS='-pipe -Wall -O2'
+ export CXXFLAGS
+ FFLAGS='-pipe -Wall -O2'
+ export FFLAGS
+ export lt_cv_deplibs_check_method=pass_all
+ lt_cv_deplibs_check_method=pass_all
+ '[' -f configure.ac -o -f configure.in ']'
+ libtoolize --copy --force
You should update your `aclocal.m4' by running aclocal.
+ ./configure --build=x86_64-alt-linux --host=x86_64-alt-linux --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/lib --localstatedir=/var/lib --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --without-included-gettext
checking for a BSD-compatible install... /usr/bin/ginstall -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for x86_64-alt-linux-gcc... x86_64-alt-linux-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether x86_64-alt-linux-gcc accepts -g... yes
checking for x86_64-alt-linux-gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of x86_64-alt-linux-gcc... none
checking for x86_64-alt-linux-gcc... (cached) x86_64-alt-linux-gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether x86_64-alt-linux-gcc accepts -g... (cached) yes
checking for x86_64-alt-linux-gcc option to accept ISO C89... (cached) none needed
checking dependency style of x86_64-alt-linux-gcc... (cached) none
checking how to run the C preprocessor... x86_64-alt-linux-gcc -E
checking for x86_64-alt-linux-g++... x86_64-alt-linux-g++
checking whether we are using the GNU C++ compiler... yes
checking whether x86_64-alt-linux-g++ accepts -g... yes
checking dependency style of x86_64-alt-linux-g++... none
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking build system type... x86_64-alt-linux-gnu
checking host system type... x86_64-alt-linux-gnu
checking for a sed that does not truncate output... /bin/sed
checking for ld used by x86_64-alt-linux-gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognize dependent libraries... (cached) pass_all
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking how to run the C++ preprocessor... x86_64-alt-linux-g++ -E
checking the maximum length of command line arguments... 98304
checking command to parse /usr/bin/nm -B output from x86_64-alt-linux-gcc object... ok
checking for objdir... .libs
checking for x86_64-alt-linux-ar... no
checking for ar... ar
checking for x86_64-alt-linux-ranlib... no
checking for ranlib... ranlib
checking for x86_64-alt-linux-strip... no
checking for strip... strip
checking for correct ltmain.sh version... no
configure: error:

*** [Gentoo] sanity check failed! ***
*** libtool.m4 and ltmain.sh have a version mismatch! ***
*** (libtool.m4 = 1.5.24, ltmain.sh = 1.5.26) ***

Please run:

  libtoolize --copy --force

if appropriate, please contact the maintainer of this
package (or your distribution) for help.

ошибка: Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.30634 (%build)


Ошибки сборки пакетов:
    Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.30634 (%build)
[lanuhum@localhost ~]$

Та же ерунда у меня и в Мандриве вылазила. Генту припутало зачем-то. Но, самое интересное, программа-то у меня собрана в Альте из исходников и успешно работает, и ./configure прошла как по маслу, а тут не хочет конфигурировать, и хоть ты выспись на ней...Хотел всё в пакеты запихнуть, чтобы Слаки не было...
« Последнее редактирование: 20.12.2008 21:54:00 от LanuHum »

Drool

  • Гость
И все-таки архив рассылок рулит, не забывайте о http://search.altlinux.org:
http://lists.altlinux.org/pipermail/sisyphus/2006-January/296839.html
Причем это был я ;)

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
И все-таки архив рассылок рулит, не забывайте о http://search.altlinux.org:
http://lists.altlinux.org/pipermail/sisyphus/2006-January/296839.html
Причем это был я ;)

Спасибо, с этой подсказкой получилось, но дальше больше. Следующая библиотека mhgui начала ругаться на freeglut,как я понял уже выполняя make по спеку. Я пошел другим путём: заархивировал каталог, в котором эта библиотека собрана из исходников и его использовал source, а в спеке удалил команды configure make. Снова собрал пакет. Можно было и первый таким макаром собрать,но это мне не нравится. Нужно как-то разобраться, чтобы devel отдельно собирался, чтобы правильно зависимости указать и правильно rpms собрать Вообще, интересное занятие - головоломка похлеще любой головоломающей игры, но надоедает.

А вот появился ещё вопрос по патчам. Я нашёл неплохое руководство по спекам, но совсем не понимаю про что тут написано:

Цитировать
Patch — патчи, исправления, которые вы или кто-то другой выпустили для данного пакета. Не принято изменять исходный текст самой программы, а затем завертывать ее в тарбол. Принято накладывать заплатки. Я рекомендую делать их следующим образом. Распаковываете исходный тарбол, у нас это будет stardict-2.4.8, далее копируете stardict-2.4.8 в stardict-2.4.8.orig. После этого изменяете код в каталоге stardict-2.4.8, выходите из него и отдаете команду diff -ur stardict-2.4.8.orig stardict-2.4.8 > stardict-2.4.8-название_патча.patch. Как видно до навания_патча идёт %{name}-%{version} пакета.
Что значит меняете код? И, в каком каталоге нужно находиться давая команду  diff -ur stardict-2.4.8.orig stardict-2.4.8 > stardict-2.4.8-название_патча.patch.

 А как правильно искать в архивах рассылок?

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
А как правильно искать в архивах рассылок?
search.altlinux.org
Андрей Черепанов (cas@)

Drool

  • Гость
И, в каком каталоге нужно находиться давая команду  diff -ur stardict-2.4.8.orig stardict-2.4.8 > stardict-2.4.8-название_патча.patch.

Рассмотрим стандартный случай - есть каталог ~/RPM, в котором есть BUILD, в котором лежит распакованный тарбол софтины softina-1.0:
1. В ~/RPM/BUILD/softina-1.0 правим нужный файл, вносим нужные изменения, с кажем в файл main.cpp (не важно)
2. Рядом с ним ложим оригинальный, не измененный файл с именем main.cpp.orig
3. В каталоге ~/RPM/BUILD говорим мантру
gendiff ./softina-1.0 .orig > ~/RPM/SOURCES/softina-1.0-название_патча.diff
4. Прописываем его в спеке в заглавной части рядом с %source№ в виде
%patch№ %name-1.0-название_патча.diff
5. В секции %prep сразу после %setup следующей строкой прописываем прикладывание патча
%patch№ -p1
6. Пробуем собрать софтину.

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
Немного прояснилось, спасибо.

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
А вот ещё такой вопрос: зависимости. В спек указываются зависимости для сборки или для собираемого пакета? Дело в том, что те зависимости, которые требует сборка не нужны собранному пакету. Но, если я прописываю зависимости для сборки, то кто устанавливает зависимости собранному пакету?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
В спек можно записать оба вида зависимостей. Кроме того при построении rpm программа высчитывает зависимости выполнения, но это минимальные зависимости - то, без чего программа не запуститься. Также есть скрипт buildreq, который высчитывает зависимости, которые нужны для построения пакета и прописывает их в spec.

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
Опять что-то не получается у меня. Собираю MakeHuman, чтобы было всё правильно. Для этого нужно собрать предварительно 4 пакета: animorph & devel, mhgui & devel. Пакеты эти собираются у меня с установкой в /usr/local, поэтому в спеке при сборке mhgui я указываю PKG_CONFIG_PATH=/usr/local/lib/pkgconfig и сборка успешно всё находит. То же самое я проделываю и при сборке MakeHuman и тоже всё собирается в /tmp, но заканчивается плачевно:
+ mkdir -p /home/lanuhum/tmp/makehuman-buildroot/usr/share/applications                         
+ desktop-file-install --vendor altlinux --dir /home/lanuhum/tmp/makehuman-buildroot/usr/share/applications makehuman.desktop                                                                     
+ /usr/lib/rpm/brp-alt                                                                           
Cleaning files in /home/lanuhum/tmp/makehuman-buildroot (auto)                                   
Verifying and fixing files in /home/lanuhum/tmp/makehuman-buildroot (binconfig,pkgconfig,libtool)
Compressing files in /home/lanuhum/tmp/makehuman-buildroot (auto)                               
Verifying ELF objects in /home/lanuhum/tmp/makehuman-buildroot (arch=normal,fhs=normal,rpath=normal,stack=normal,textrel=normal,unresolved=normal)                                               
verify-elf: ERROR: ./usr/local/bin/makehuman: not found: libanimorph.so.0                       
verify-elf: ERROR: ./usr/local/bin/makehuman: not found: libmhgui.so.0                           
verify-elf: ERROR: ./usr/local/bin/makehuman: undefined symbol: _ZN5mhgui6Window11w_singletonE

и таких ещё много строчек, и в конце
ошибка: Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.41115 (%install)


Ошибки сборки пакетов:
    Неверный код возврата из /home/lanuhum/tmp/rpm-tmp.41115 (%install)
[lanuhum@localhost mhgui-0.2]$

Как я понял не находятся установленные библиотеки. Попытка запустить оболочку konqueror подтверждает:
./makehuman: error while loading shared libraries: libanimorph.so.0: cannot open shared object file: No such file or directory

Что делать?

Оффлайн LanuHum

  • Завсегдатай
  • *
  • Сообщений: 171
    • Email
Создал символьные ссылки в /usr/lib64 получилась сборка. Теперь мне не ясно следующее. Если я делаю, чтобы animorph установился в /usr/lib64, то следующий пакет mhgui не устанавливается, жалуясь, что в /usr/local/lib нет libanimorph.so.0

Я так понимаю, что я не знаю как заставить сборку программы устанавливать свои файлы не в local, а непосредственно в /usr, и не в /lib, а в /lib64. Я ранее делал принудительную установку. Прописывал в спеке: mv lib lib64 и mv /usr/local/lib64 /usr. Это,наверное, неправильно. Файлы оказывались, там где нужно, но думали, что они всё ещё не на месте...