天天看點

spec檔案詳解

轉載自:扶凱[http://www.php-oa.com]

編譯目錄組成介紹

rpm-build 包和  /usr/src/redhat ,這些 rpm build 的程式是要靠 spec 檔案的控制。它是配置指定安裝到另外的機器上的,用來訓示轉換的源碼更新檔編譯成二進制檔案的包。預設編譯操作是在下面的目錄中,它是編譯源碼的相關動作操作的位置。

如果不指定其它的地方,那麼 rpm building 的地方是主要在 /usr/src/redhat 的目錄,目錄的架構如下,這就是為 rpm-build 提供的目錄結構.

?

1 2 3 4 5 6 7 8 9 10 11 12

/usr/src/redhat/

|-- BUILD

|-- RPMS

|   |-- i386

|   `-- ...

|-- SOURCES

|   |-- foo-1.2.tar.gz

|   |-- foo-1.2-add_feature.patch

|   `-- foo-1.2-change_default.patch

|-- SPECS

|   `-- foo.spec

`-- SRPMS

檔案的提取,編譯都将在 BUILD 的目錄,運作後結果的包會在 RPMS 和 RPMS 目錄.

RPM 的宏指令

宏(Macros)是使用變量和功能來控制rpm和 rpmbuild 的自定義的行為,宏指令一般地定義在 spec 檔案中。文法象 %define macro value .宏指定也可以事先在配置檔案中調整。

就是下面的檔案。

  • 預設設定為 /usr/lib/rpm/macros or /etc/rpm/macros
  • 使用者設定 ~/.rpmmacros

在打包的過程中,spec files 和 rpmbuild 能使用RPM 的宏指令中的變量.

此外,在 rpmbuild 時要不顧目前設定,可以在後面加上 –define=’macro value’ 選項,要顯示目前的宏指令可以使用 rpm –eval %{macro} ,也可以rpm –showrc 來 dump 全部目前的宏指令和設定。

你沒有必要使用所有的宏指令,也能容易的管理 rpm 的 spec 檔案。一個好的建議是,不要編譯包使用 root 使用者.你能建立一個 ${HOME}/.rpmmacro 檔案,然後設定 %_topdir ,非 root 使用者能就能不使用 /usr/src/redhat 架構的目錄在系統上。另外還有一個好處,就是安裝  SRPMs 時,會安裝到 %_topdir 目錄.宏指令象 %_rpmdir, %_specdir 可以更加細的控制 rpm 在編譯過程中的目錄.

宏指令有時指定在使用指令時,%configure 宏運作源碼在 .configure 腳本在運作源碼給合适的你的機器架構資訊。 %makeinstall 宏指令通過使用 GNU Automake 傳送合适的選項。

宏指令的目錄是參考本地的相關資訊, %_tmppath 是編譯時的臨時的目錄,預設設定的是 /var/tmp. 其它的宏指令如 %_perfix 是設定目錄象 %configure 寵中和 –prefix 的選項.預設是 /usr.這個 %_perfix 選項也會影響到其它使用這個目錄的變量,如 %_bindir 它是設定的 %{_prefix}/bin 為預設的. 可以通過 /usr/lib/rpm/macros 檢視其它更加多的例子.

在運作時可以重新定義宏,使用者自己可以設定rpm-build的非特權的目錄%{_topdir}. 來指定任意目錄.

Spec 檔案

重點注意

  1. 版本: Name,Version,Release
  2. 其它軟體有關的資訊: Group,License,URL,Summary
  3. 先決條件: PreReq,Requires,BuildPreRep,Provides,Obsoletes,Conflicts
  4. 輸入: Source[#],Patch[#]
  5. BuildRoot,BuildArch

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

%define

name foo 

# 名字

%define

version 1.2 

#version

Name: %{name}  

#name 就是使用的上面的宏指令

Version: %{version}  

#version 也是使用的上面的宏指令

Release: 3

License: GPL

Group: Applications/Productivity 

# 軟體是哪個組的,更多資訊檢視 /usr/share/doc/rpm-version/GROUPS

URL: http://www.foo.org

Source: ftp://www.foo.org/pub/people/elvis/

%25

%7Bname

%7D

-

%25

%7Bversion

%7D

.tar.gz

Patch0: foo-1.2-change_default.patch

Patch1: foo-1.2-add_feature.patch

PreReq: unzip  

# 安裝前需要什麼

Requires: pam 

# 安裝後需要什麼

BuildPreReq: gcc >= 2.96

#打包前需要什麼

BuildRoot: %{_tmppath}/%{name}-root 

# 準備源碼檔案的 chroot 的目錄

Summary: A fictional

open

source

package

for

the offering. 

#摘要

%description

#描述

注意,spec 檔案很多資訊都是取自宏指令,如果沒有明确指定,就會繼承 /usr/lib/rpm/macros 和其它相關宏指令的檔案.

Spec 檔案之 %prep

%prep 這部分其它是由一些參數來組成一個 shell 腳本來從 SOURCES 中解壓源碼和應用更新檔到 BUILD 目錄中來準備下面的編譯。

和 %prep 相關的宏指令

%setup

%patch

例:

?

1 2 3 4 5

%prep

%setup

-q  

#提取源碼到 BUILD 目錄; -q 指不顯示輸出(quietly)

%patch0

-p1 

# 應用 patch0

%patch1

-p1 -b .orig  

# 應用 Patch1 但是存下源檔案成 .oring 的字尾

unzip foo_data.zip  

# 接下來解壓 zip 檔案

Spec 檔案之 %build

%build 是編譯和準備軟體,運作象一個 shell 腳本,它運作在上下文目錄指定的源碼目錄。在編譯過程中,調用腳本 .config 在本地的目錄(%configure 中配置的).

和 %build 相關的宏

%configure  # 可以通過運作 rpm -eval %configure 來看它的設定

例:

?

1 2 3

%build

%configure

--enable-shared

CFLAGS=-O2 make

Spec 檔案之 %install

%install 是用來做 rpm 安裝所有需要的檔案。這些打包的檔案會複制到前面的講的 BuildRoot 中的目錄樹中。通常這個目錄是使用的 /var/tmp 中。

$RPM_BUILD_ROOT 參數來設定 BuildRoot.

主要不能使用真實目錄來設定的主要原因是,在編譯的過程中有可能會有檔案替換到你系統中的檔案引起系統和軟體問題.對其它的檔案路徑象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用預先定義的宏來指定的. 預設都是跑在這個 RPM_BUILD_ROOT 目錄下的。

例:

?

1 2 3 4

%install

rm -rf

$RPM_BUILD_ROOT

# 預設的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-root

make DESTDIR=

$RPM_BUILD_ROOT

install  

# 指定安裝檔案的路徑

install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8

Spec 檔案之 %clean

%clean 是用來清理 build 後的臨時檔案,主要是怕這些舊的檔案影響以後編譯。主要是要删除 $RPM_BUILD_ROOT 和運作 make clean 。

例:

?

1 2 3

%clean

rm -rf

$RPM_BUILD_ROOT

make clean

 Spec 檔案之 Scriptlets

這些選項可以讓你動态的使用 shell 腳本來控制安裝和删除,

%pre,%post  是用腳本運作在包安裝後,注意沒法互動

%preun,%postun  用腳本運作在包删除時

rpm -q –scripts packagename # 可以看到腳本的資訊

例如:

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

%pre

groupadd -g 201 foo

useradd -g foo -s /bin/false -d /var/foo -M foo

%post

/sbin/ldconfig

chkconfig --add food

%preun

if

[

$1

= 0 ]

then

service food stop > /dev/null 2>&1

chkconfig --del food

fi

%postun

if

[

$1

= 0 ]

then

userdel foo

groupdel foo

else

/sbin/ldconfig

service food condrestart > /dev/null 2>&1

fi

注意,在這個當中的 $1 的數字,如果是 1 是指是第一次安裝,如果是 2 是指也許是更新。如果是 0 在 %postun , 是指被完全的删除

Spec 檔案之 %files

%files 任何打包的檔案,都需要在這個包的詳細的檔案清單中,如果是目錄,包的所有者的全部目錄都在中間,%dir 來指定空目錄,可以用 %files -f /tmp/dyanmic_filelist 來指定一個檔案清單。預設 %config 會替換掉配置,給原來的配置修改名字為 .rpmorig ,如果不想修改的話,就用%config(noreplace) 就會給新的配置檔案名字命名為 .rpmnew.

%defattr(mode,user,group)

    %attr(mode,user,group) filename

%config  配置檔案

%doc 文檔

例:

?

1 2 3 4 5 6 7 8 9

%files

%defattr

(-,root,root)

%config

/etc/foo.conf

# 指定了才能在更新和删除時有用

/usr/sbin/food

/usr/bin/foo

%doc

README

# 目錄是在 /usr/share/doc/%{name}-%{version}

%doc

/usr/share/man/man8/food.8

/usr/share/foo/

%dir

/var/

lock

/foo/ 

# 空的目錄

 Spec 檔案之 %changelog

%changelog 是記錄包的修改,比如加入一個新的更新檔,修改配置,日志使用 data +"%a %b %d %Y",需要顯示包的日志改變的資訊可以使用 rpm-q –changelog.

繼續閱讀