Основы программирования в Linux - Нейл Мэтью
Шрифт:
Интервал:
Закладка:
install -m755 myapp $RPM_BUILD_ROOT%{_bindir}/myapp
install -m755 myapp.1 $RPM_BUILD_ROOT%{_mandir}/myapp.1
В этом примере при необходимости создаются каталоги для файлов, а затем устанавливаются исполняемый файл myapp и интерактивное справочное руководство myapp.1. Переменная окружения $RPM_BUILD_ROOT содержит местоположение Buildroot, заданное ранее. Макросы %{_bindir} и %{_mandir} замещаются текущим каталогом двоичных файлов и каталогом страниц интерактивного справочного руководства соответственно.
ПримечаниеЕсли вы пользуетесь сценарием configure для создания make-файла, все разнообразные каталоги в нем будут заданы должным образом. В большинстве случаев вам не придется задать все команды установки вручную, как. показано в предыдущем примере.
Задание %clean удаляет файлы, созданные командой rpmbuild. Например:
%clean
rm -rf $RPM_BUILD_ROOT
После описания построения пакета следует задать все файлы, которые будут устанавливаться. RPM-система очень строга на этот счет. Она и должна быть строгой для того, чтобы иметь возможность отследить должным образом каждый файл в каждом пакете. В секции %files перечисляются имена всех файлов, включаемых в пакет. В данном случае у нас только два файла предназначены для распространения в двоичном пакете: исполняемый файл myapp и страница интерактивного справочного руководства myapp.1. Например:
%files
%{_bindir}/myapp
%{_mandir}/myapp.1
RPM-система может выполнять сценарий до и после установки вашего пакета. Например, если ваш пакет — процесс-демон, для его запуска, возможно, нужна корректировка сценариев установки системы. Сделайте это с помощью сценария %post. Далее приведен простой пример, отправляющий сообщение по электронной почте:
%post
mail root -s "myapp installed — please register" </dev/null
Поищите примеры в серверных RPM-файлах spec.
Далее приводится полный файл spec для вашего простого приложения.
#
# spec file for package myapp (Version 1.0)
#
Vendor: Wrox Press
Distribution: Any
Name: myapp
Version: 1.0
Release: 1
Packager: [email protected]
License: Copyright 2007 Wiley Publishing, Inc.
Group: Applications/Media
Provides: goodness
Requires: mysql >=3.23
Buildroot: %{_tmppath}/%{name}-%{version}-root
source: %{name}-%{version}.tar.gz
Summary: Trivial application
%description
MyApp Trivial Application
A trivial application used to demonstrate development tools.
This version pretends it requires MySQL at or above 3.23.
Authors: Neil Matthew and Richard Stones
%prep
%setup -q
%build
make
%install
mkdir -p $RPM_BUILD_ROOT%{bindir}
mkdir -p $RPM_BUILD_ROOT%{_mandir}
install -m755 myapp $RPM_BUILD_ROOT%{_bindir}/myapp
install -m755 myapp.1 $RPM_BUILD_ROOT%{_mandir}/myapp.1
%clean
rm -rf $RPM_BUILD_ROOT
%post
mail root -s "myapp installed — please register" </dev/null
%files
%{_bindir}/myapp
%{_mandir}/myapp.1
Теперь вы готовы к формированию RPM-пакета.
Создание RPM-пакета с помощью rpmbuildСоздаются пакеты с помощью команды rpmbuild со следующей синтаксической записью:
rpmbuild -bBuildStage spec_file
Опция -b заставляет rpmbuild создать RPM-пакет. Дополнительная опция BuildStage — специальный код, информирующий команду rpmbuild о том, как далеко она может зайти в процессе создания. В табл. 9.5 перечислены опции команды.
Таблица 9.5
Опция Описание -ba Создавать и двоичный, и исходный RPM-пакет -bb Создавать двоичный RPM-пакет -bc Компилировать программу, но не создавать полный RPM-пакет -bp Подготовиться к созданию двоичного RPM-пакета -bi Создать двоичный RPM-пакет и установить его -bl Проверить список файлов RPM-пакета -bs Создать только RPM-пакет исходных файловДля создания двоичного RPM-пакета и пакета исходных файлов используйте опцию -ba. RPM-пакет исходных файлов позволит создать повторно двоичный RPM- пакет.
Скопируйте RPM-файл spec в корректный каталог SOURCES, поместив его рядом с исходным файлом приложения:
$ cp myapp.spec /usr/src/redhat/SOURCES
Далее приведен вывод, сопровождающий создание пакета в системе SUSE Linux, пакеты в которой создаются из каталога /usr/src/packages/SOURCES:
$ rpmbuild -ba myapp.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.47290
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd /usr/src/packages/BUILD
+ rm -rf myapp-1.0
+ /usr/bin/gzip -dc /usr/src/packages/SOURCES/myapp-1.0.tar.gz
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 '] '
+ cd myapp-1.0
++ /usr/bin/id -u
+ '[' 1000 = 0 ']'
++ /usr/bin/id -u
+ '[' 1000 = 0 ']'
+ /bin/chmod -Rf a+rX, u+w, g-w, o-w
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.99663
+ umask 022
+ cd /usr/src/packages/BUILD
+ /bin/rm -rf /var/tmp/myapp-1.0-root
++ dirname /var/tmp/myapp-1.0-root
+ /bin/mkdir -p /var/tmp
+ /bin/mkdir /var/tmp/myapp-1.0-root
+ cd myapp-1.0 + make
gcc -g -Wall -ansi -с -o main.о main.c
gcc -g -Wall -ansi -с -o 2.o 2.c
ar rv mylib.a 2.o
ar: creating mylib.a
a - 2.о
gcc -g -Wall -ansi -с -o 3.o 3.c
ar rv mylib.a 3.o
a — 3.o
gcc -o myapp main.о mylib.a
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.47320
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd myapp-1.0
+ mkdir -p /var/tmp/myapp-1.0-root/usr/bin
+ mkdir -p /var/tmp/myapp-1.0-root/usr/share/man
+ install -m755 myapp /var/tmp/myapp-1.0-root/usr/bin/myapp
+ install -m755 myapp.1 /var/tmp/myapp-1.0-root/usr/share/man/myapp.1
+ RPM_BUILD_ROOT=/var/tmp/myapp-1.0-root
+ export RPM_BUILD_ROOT
+ test -x /usr/sbin/Check -a 1000 = 0 -o
-x /usr/sbin/Check -a '!' -z /var/tmp/myapp-1.0-root
+ echo 'I call /usr/sbin/Check...'
I call /usr/sbin/Check...
+ /usr/sbin/Check
-rwxr-xr-x 1 neil users 926 2007-07-09 13:35 /var/tmp/myapp-1.0-root/ /usr/share/man/myapp.1.gz
Checking permissions and ownerships — using the permissions files
/tmp/Check.perms.017506
setting /var/tmp/myapp-1.0-root/ to root:root 0755 (wrong owner/group neil:users)
setting /var/tmp/myapp-1.0-root/usr to root:root 0755. (wrong owner/group neil:users)
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-symlink
Processing files: myapp-1.0-1
Finding Provides: /usr/lib/rpm/find-provides myapp
Finding Requires: /usr/lib/rpm/find-requires myapp
Finding Supplements: /usr/lib/rpm/find-supplements myapp
Provides: goodness
Requires(interp): /bin/sh
Requires(rpmlib): rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib (CompressedFileNames) <= 3.0.4-1
Requires(post): /bin/sh
Requires: mysql >= 3.23 libc.so.6 libc.so.6 (GLIBC 2.0)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/myapp-1.0-root
Wrote: /usr/src/packages/SRPMS/myapp-1.0-1.src.rpm
Wrote: /usr/src/packages/RPMS/i586/myapp-1.0-1.i586.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.10065
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd myapp-1.0
+ rm -rf /var/tmp/myapp-1.0-root
+ exit 0
Когда сборка будет закончена, вы должны увидеть два пакета: двоичный RPM-пакет в подкаталоге с названием типа архитектуры, например i586 каталога RPMS, и RPM-пакет исходных файлов в каталоге SRPMS.
У файла двоичного RPM-пакета будет имя, похожее на следующее:
myapp-1.0-1.i586.rpm
У вашей системы может быть другая архитектура.
Имя файла RPM-пакета исходных файлов будет следующим:
myapp-1.0-1.src.rpm
ПримечаниеПакеты должен устанавливать суперпользователь. Создавать пакеты от имени пользователя root нет необходимости, если у вас есть права на запись в каталоги RPM-системы, обычно это каталоги /usr/src/redhat. Как правило, не следует создавать RPM-пакеты как пользователь root, потому что в файле spec могут быть команды, способные повредить вашу систему.
Пакеты других форматов
Несмотря на то, что RPM — популярный способ распространения приложений, позволяющий пользователям управлять установкой и деинсталляцией пакетов, существуют и конкурирующие пакеты. Некоторое программное обеспечение все еще распространяется в виде сжатых программой gzip tar-файлов (tgz). Обычно инсталляция состоит из распаковки архива во временный каталог и затем выполнения сценария непосредственно установки.
Дистрибутивы Linux Debian и на основе Debian (а также некоторые другие) поддерживают другой формат упаковки, по функциональности похожий на RPM и именуемый dpkg. Утилита dpkg дистрибутива Debian распаковывает и устанавливает файлы пакета, обычно имеющие расширение deb. Если вам нужно распространять приложение как файл пакета с расширением deb, можно преобразовать RPM-пакет в формат dpkg с помощью утилиты Alien. Дополнительную информацию о ней можно найти на Web-сайте http://kitenet.net/programs/alien/.