| 用Open Source工具開發軟體: 新軟體開發關念 | ||
|---|---|---|
| Prev | Chapter 8. 套件包裝製作 | |
rpm檔主要是他有一個主控制檔在/etc/rpmrc, 這主要設定rpm的一些環境,不是要包裝package的資訊。 想要知道目前rpm所屬系統狀態,例如build的platform用
# rpm --showrc |
rpm真正的像debian的control這種information檔,是在一個叫xxxx.spec的檔 這個才是我們真正要準備的。 通常命名是packagename-versionnumber-releasenumber.spec, 通常是放在/usr/src/redhat/SPECS下。
rpm檔建立時是連source binary package一起建立的, 所以要把source code, patch檔案等等準備好。 /usr/src/redhat/下有5個目錄
SOURCES source code, patch檔放在這 .tar.gz的形式
SPECS 這就是放資訊檔xxx.spec的的地方
BUILD source code會在這裡被解開並且compile與make
RPMS binary package最後在這裡產生
SRPMS source package最後在這裡產生
|
以eject-2.0.2-1.spec為例子
Summary: A program that ejects removable media using software control.
Name: eject
Version: 2.0.2
Release: 3
Copyright: GPL
Group: System Environment/Base
Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/eject-2.0.2.tar.gz
Patch: eject-2.0.2-buildroot.patch
URL:
Vendor: ComC Software Corporation
Packager: Santa Claus < sclaus@northpole.com>
BuildRoot: /var/tmp/%{name}-buildroot
Requires: libc >= 2.2
%description
The eject program allows the user to eject removable media
(typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks)
using software control. Eject can also control some multi-
disk CD changers and even some devices' auto-eject features.
Install eject if you'd like to eject removable media using
software control.
%prep
%setup
%patch -p1 -b .buildroot
%build
configure --prefix=$RPM_BUILD_ROOT
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1
install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog
%attr(-, root, root) /usr/local/bin/cdplay
/usr/bin/eject
/usr/man/man1/eject.1
%pre
if test; then cmd1; fi #pre-install script code
%post
%preun
%postun
%changelog
* Sun Mar 21 1999 Cristian Gafton < gafton@redhat.com>
- auto rebuild in the new build environment (release 3)
* Wed Feb 24 1999 Preston Brown < pbrown@redhat.com>
- Injected new description and group.
|
其中比較要說明的有: GROUP很像debain的Section分類用的,在/usr/doc/rpm/GROUP找的到。 BuildRoot:這個就是假的root,等下在%build與%install時,有個 $RPM_BUILD_ROOT, 這個內定環境變數就是這個設定值。 Requires:是手動設定dependency。rpm可以自動幫你找 dependency,不過也可以手動指定。
%prep這邊是prepare準備build的動作 通常是你download的source code需要做一些你自己做的patch, 要作untar等動作。例如
%prep rm -rf $RPM_BUILD_DIR/cdplayer-1.0 zcat $RPM_SOURCE_DIR/cdplayer-1.0.tgz | tar -xvf - |
%prep %setup %patch |
%build就是當你要從source來build binary時要打的命令。 通常就是
configure --prefix=$RPM_BUILD_ROOT make |
make install
|
%files才是真正告訴package是要裝到那裡的files list, %doc裡的檔會被裝到/usr/doc/$NAME-$VERSION-$RELEASE, %attr是設定安裝時檔案的權限,
%attr(mode, user, group)
|
如果有用BuildRoot的話,rpm自動知道要到相對應的假 root,下去把~fakeroot/usr/bin/ 根據%files指定的檔放到package的正確/usr/bin/。
rpm的pre- post- install與remove 不像solaris或debian的另寫真正的額外shell script檔, 而是把shell script含進spec檔內的%pre %post %preun %postun下。
寫完後到存到/usr/src/redhat/SPECS下並且給命令
# rpm -ba eject-2.0.2-1.spec |
從maximum rpm下抄一個例子出來
# rpm -ba cdplayer-1.0.spec * Package: cdplayer Executing: %prep + cd /usr/src/redhat/BUILD ? + exit 0 Executing: %build + cd /usr/src/redhat/BUILD + cd cdplayer-1.0 ? + exit 0 + umask 022 Executing: %install + cd /usr/src/redhat/BUILD + cd cdplayer-1.0 + make ROOT=/tmp/cdplayer install install -m 755 -o 0 -g 0 -d /tmp/cdplayer/usr/local/bin/ install -m 755 -o 0 -g 0 cdp /tmp/cdplayer/usr/local/bin/cdp ln -s ./cdp /tmp/cdplayer/usr/local/bin/cdplay install -m 755 -o 0 -g 0 -d /tmp/cdplayer/usr/local/man/man1/ install -m 755 -o 0 -g 0 cdp.1 /tmp/cdplayer/usr/local/man/man1/cdp.1 + exit 0 Executing: special doc + cd /usr/src/redhat/BUILD + cd cdplayer-1.0 + DOCDIR=/tmp/cdplayer//usr/doc/cdplayer-1.0-1 + rm -rf /tmp/cdplayer//usr/doc/cdplayer-1.0-1 + mkdir -p /tmp/cdplayer//usr/doc/cdplayer-1.0-1 + cp -ar README /tmp/cdplayer//usr/doc/cdplayer-1.0-1 + exit 0 Binary Packaging: cdplayer-1.0-1 Finding dependencies... Requires (2): libc.so.5 libncurses.so.2.0 usr/doc/cdplayer-1.0-1 usr/doc/cdplayer-1.0-1/README usr/local/bin/cdp usr/local/bin/cdplay usr/local/man/man1/cdp.1 93 blocks Generating signature: 0 Wrote: /usr/src/redhat/RPMS/i386/cdplayer-1.0-1.i386.rpm + umask 022 + echo Executing: %clean Executing: %clean + cd /usr/src/redhat/BUILD + cd cdplayer-1.0 + exit 0 Source Packaging: cdplayer-1.0-1 cdplayer-1.0.spec cdplayer-1.0.tgz 82 blocks Generating signature: 0 Wrote: /usr/src/redhat/SRPMS/cdplayer-1.0-1.src.rpm |