1. Cấu trúc Spec File
Các file RPM (gói phần mềm) được sử dụng rất nhiều trong nhiều distro Linux: Redhat, Fedora, Turbo Linux... Cấu trúc RPM do Redhat phát triển. Để tạo ra các file RPM chúng ta dùng lệnh rpmbuild với tham số là file spec.
File spec bao gồm sáu phần chính: header (đầu mục),
%prep, %build, %install, %clean, %files, %changelog, các mục này chỉ có một và theo trình tư như đã liệt kê, trong mỗi mục đó có thể có một số macro (lưu ý là các macro cũng có dấu % ở trước). Trong các mục này có thể thực hiện các lệnh shell (sh), nhưng không cần có
#!/bin/sh.
Các macro có thể xuất hiện nhiều lần trong một mục.
File Spec được sử dụng để tạo các gói rpm. Tên file chúng ta nên đặt theo quy ước chuẩn:
têngói-gạchngang-sốhiệuphiênbản-sốhiệupháthành-chấm-spec.
Đây là một ví dụ (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
BuildRoot: /var/tmp/%{name}-buildroot
%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 -q
%patch -p1 -b .buildroot
%build
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
/usr/bin/eject
/usr/man/man1/eject.1
%changelog
* Sun Mar 21 1999 Cristian Gafton
- auto rebuild in the new build environment (release 3)
* Wed Feb 24 1999 Preston Brown
- Injected new description and group.
[ Some changelog entries trimmed for brevity. -Editor. ]
2. Tiêu đề (The Header)
Tiêu đề bao gồm một số mục sau:
Summary: Một dòng mô tả về sản phẩm.
Name: tên gói mà bạn sẽ sử dụng.
Version: chuỗi số phiên bản.
Release: chuỗi phát hành.
Copyright: Bản quyền.
Source: Là thư mục chứa mã nguồn hoặc nơi chứa mã nguồn. Bạn cũng có thể mô tả nhiều nơi chứa mã nguồn như sau::
Source0: blah-0.tar.gz
Source1: blah-1.tar.gz
Source2: fooblah.tar.gz
Patch: nơi mô tả các gói patch, các goi snày phải có tên file chính xác sẽ được sử dụng sau này trong quá trình patch:
Patch0: blah-0.patch
Patch1: blah-1.patch
Patch2: fooblah.patch
Các file này phải nằm trong thư mục mã nguồn (SOURCES directory).
Group: Là nhóm mà gói phần mềm thuộc trong đó, có thể là mức cao nhất trong bộ gói cài đặt của Red Hat (Red Hat's gnorpm). Bạn cũng có thể tìm thấy một số thông tin ở /usr/doc/rpm*/GROUPS. Ví dụ về cây của các nhóm gói phần mềm:
Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Internet
Applications/Multimedia
Applications/Publishing
Applications/System
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support
BuildRoot: Dòng này quy định thư mục "gốc" cho mã nguồn để biên dịch và cài đặt.
%description mô tả về phần mềm, có thể được viết ở dạng nhiều dòng.
3. Prep
Đây là phần chuẩn bị để biên dịch, bao gồm giải nén, vá chuẩn bị để chạy chương trình
make.
Bạn có thể tạo ra file shell để làm các công tác chuẩn bị, tuy nhiên rpm có sẵn một số macro để làm đơn giản quá trình đó.
Macros đầu tiên là
%setup . nếu không có tham số thì nó đơn giản là giải nén mã nguồn và chuyển (cd) đến thư mục chứa mã nguồn.
%setup có một số tham số sau:
-n name Quy định tên thư mục mã nguồn biên dịch khác với mặc định với tên là name. Mặc định là $NAME-$VERSION. Hoặc có thể là $NAME, ${NAME}${VERSION}, hoặc bất kỳ thế nào do tar file sử dụng. (Chú ý rằng dấu "
$" ở đây không hẳn là biến thực trong file spec. Bạn phải dùng tên và version thật.
-c tạo và chuyển thư mục đến thư mục trước khi giải nén (untar).
-b sẽ giải nén mã nguồn thứ #n trước khi chuyển thư mục tới thư mục mã nguồn. Tham số này có ích nếu có nhiều file mã nguồn.
-a sẽ giải nén mã nguồn thứ #n sau khi chuyển tới thư mục mã nguồn.
-T Tham số này sẽ không giải nén và yêu cầu các tham số -b 0 hoặc -a 0 để có mã nguồn giải nén.
-D không xoá thư mục trước khi giải nén. Thường được dùng khi có nhiều %setup, để tránh xoá phần giải nén ở %setup trước, tuy nhiên thường không dùng nếu chỉ có 1 %setup.
Macro tiếp theo là %patch. Phần này sẽ tự động vá (patch mã nguồn), có một số tham s sẽ thực hiện patch#n như là các patch file.
-p chỉ ra số thư mục sẽ thực hiện patch(n) command.
-P Mặc định sẽ thực hiện Patch (hay Patch0). This flag inhibits the default action and will require a 0 to get the main source file untarred. This option is useful in a second (or later) %patch macro that required a different number than the first macro.
Bạn có thể thực hiện %patch thay cho thực hiện lệnh thực tế:
%patch #n -P
-b extension sẽ lưu lại các file gốc với phần mở rộng là filename.extension trước khi thực hiện vá (patching).
Ngoài các macro này ra bạn cũng có thể thực hiện bất kỳ lệnh nào dạng shell (sh) cho đến mục
%build.
4. Build
Bạn có thể liệt kê các lệnh ở đây để biên dịch mã nguồn sau khi đã giải nén và chuyển thư mục hiện thời tơi sthư mục mã nguồn.
Biến RPM_OPT_FLAGS được thiết lập với các giá trị trong /usr/lib/rpm/rpmrc. Hãy kiểm tra với các giá trị thích hợp. Hoặc có thể không cần sử dụng trong file spec.
5. Install
Ở đây không có macro nhưng bạn có thể thực hiện bất kỳ lệnh nào dạng shell để cài đặt, thường bạn dùng lệnh make install để thực hiện phần cài đặt.Bạn lưu ý rằng thư mục hiện thời phải là thư mục mã nguồn.
Biến RPM_BUILD_ROOT cũng được sử dụng để quy định về thưc mục trong phần tiêu đề Buildroot.
6. Dọn dẹp (clean)
Thông thường trước khi buil, tạo gói bạn nên xoá bỏ các file xuất hiện trong quá trình biên dịch, và macro %clean sẽ giúp bạn thực hiện điều đó.
7. Một số scripts dành cho trước và sau khi cài đặt
Bạn có thể thực hiện một số scripts trước và sau khi cài đặt hoặc gỡ bỏ (installation and uninstallation) của các gói nhị phân (binary). Mục đích chính là có thể chạy ldconfig sau khi cài đặt hoặc gỡ bỏ các gói dùng các thư viện chi sẻ (shared libraries). Bao gồm các macro sau::
%pre là macro thực hiện trước khi cài đặt (pre-install scripts).
%post là macro thực hiện sau khi cài đặt (post-install scripts).
%preun là macro thực hiện trước khi gỡ bỏ (pre-uninstall scripts).
%postun là macro thực hiện sau khi gỡ bỏ (post-uninstall scripts).
Nội dung các macro này là các lệnh shell (sh) nhưng không cần dòng #!/bin/sh ở đầu.
8. Files
Mục này liệt kê các danh sách file và thư mục cho gói nhị phân. Thường danh sách này bạn có thể xem ở trong phần
make install.
Ở đây cũng có một số macro để phục vụ cho một số mục đích nào đó:
%doc chỉ ra các file tài liệu (doc) sẽ được đóng gói trong file nhị phân. Tài liệu sẽ được cài trong thư mục /usr/doc/$NAME-$VERSION-$RELEASE. Bạn có thể liệt kê nhiều tài liệu sau phần macro này, hay có thể liệt kê từng tài liệu sau từng macro này.
%config đánh dấu rằng đây là các file config. Bao gồm cả các file như sendmail.cf, passwd, etc. Sau này dù các file config có thay đổi thì nó cũng vẫn được remove.
%dir chỉ ra rằng chỉ có riêng thư mục được liệt kê ở đây như là thành phần của gói. Bình thường nếi liệt kê thư mục không có macro
%dir, thì tất cả những gì có trong thư mục đó sẽ được cho vào gói.
%defattr cho phép bạn đặt thuộc tính mặc định cho các file được liệt kê ở dưới. Thuộc tính được mô tả theo dạng (mode, owner, group) , mode là số cơ số 8 mô tả bit pattern (giống như trong lệnh chmod), owner là username , group là tên group mà bạn có thể gán được. Bạn cũng có thể đặt ở một trường nào đấy dấu '-' nếu sử dụng mặc định.
%files -f cho phép bạn liệt kê các file trong một file nào đó của bạn trong thư mục mã nguồn. Chức năng này thường được sử dụng khi gói có file liệt kê danh sách riêng, trong trường hợp đó bạn không phải liệt kê tất cả các file ở đây mà chỉ cần chèn file chứa danh scáh file là được.
Ghi chú: nếu bạn chẳng may liệt kê /usr/bin thì gói nhị phân sẽ bao gồm tất cả các file có trong thư mục này.
9. Changelog
log ghi lại những cập nhật và thay đổi của gói, mỗi khi thay đổi RPM bạn nên ghi lại những thay đổi ở đây.
Định dạng khá là đơn giản, mỗi mục bắt đầu bằng một dòng có dấu '*' sau đó là ngày tháng, tên người cập nhật, địa chỉ email, theo định dạng sau:
date +"%a %b %d %Y"
Phần còn lại là text theo một trình tự nhất định nào đó, thường là các dòng có gạch đầu dòng ở đầu.
http://vkopensource.blogspot.com/