在關於 RPM 軟件包構建的上一篇文章中,你瞭解到了源 RPM 包括軟件的源代碼以及 spec 文件。這篇文章深刻研究了 spec 文件,該文件中包含了有關如何構建 RPM 的指令。一樣,本文以 fpaste 爲例。 |
瞭解源代碼html
在開始編寫 spec 文件以前,你須要對要打包的軟件有所瞭解。在這裏,你正在研究 fpaste,這是一個很是簡單的軟件。它是用 Python 編寫的,而且是一個單文件腳本。當它發佈新版本時,可在 Pagure 上找到:https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz。python
如該檔案文件所示,當前版本爲 0.3.9.2。下載它,以便你查看該檔案文件中的內容:linux
$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz $ tar -tvf fpaste-0.3.9.2.tar.gz drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/ -rw-rw-r-- root/root 25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore -rw-rw-r-- root/root 3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG -rw-rw-r-- root/root 35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING -rw-rw-r-- root/root 444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile -rw-rw-r-- root/root 1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst -rw-rw-r-- root/root 658 2018-07-25 02:58 fpaste-0.3.9.2/TODO drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/ drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/ drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/ -rw-rw-r-- root/root 3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1 -rwxrwxr-x root/root 24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste lrwxrwxrwx root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste
你要安裝的文件是:git
fpaste.py:應該安裝到 /usr/bin/。
docs/man/en/fpaste.1:手冊,應放到 /usr/share/man/man1/。
COPYING:許可證文本,應放到 /usr/share/license/fpaste/。
README.rst、TODO:放到 /usr/share/doc/fpaste/ 下的其它文檔。github
這些文件的安裝位置取決於文件系統層次結構標準(FHS)。要了解更多信息,能夠在這裏閱讀:http://www.pathname.com/fhs/ 或查看 Fedora 系統的手冊頁:安全
$ man hier
第一部分:要構建什麼?服務器
如今咱們知道了源文件中有哪些文件,以及它們要存放的位置,讓咱們看一下 spec 文件。你能夠在此處查看這個完整的文件:https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec。工具
這是 spec 文件的第一部分:ui
Name: fpaste Version: 0.3.9.2 Release: 3%{?dist} Summary: A simple tool for pasting info onto sticky notes instances BuildArch: noarch License: GPLv3+ URL: https://pagure.io/fpaste Source0: https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz Requires: python3 %description It is often useful to be able to easily paste text to the Fedora Pastebin at http://paste.fedoraproject.org and this simple script will do that and return the resulting URL so that people may examine the output. This can hopefully help folks who are for some reason stuck without X, working remotely, or any other reason they may be unable to paste something into the pastebin
Name、Version 等稱爲標籤,它們定義在 RPM 中。這意味着你不能只是隨意寫點標籤,RPM 沒法理解它們!須要注意的標籤是:this
Source0:告訴 RPM 該軟件的源代碼檔案文件所在的位置。
Requires:列出軟件的運行時依賴項。RPM 能夠自動檢測不少依賴項,可是在某些狀況下,必須手動指明它們。運行時依賴項是系統上必須具備的功能(一般是軟件包),才能使該軟件包起做用。這是 dnf 在安裝此軟件包時檢測是否須要拉取其餘軟件包的方式。
BuildRequires:列出了此軟件的構建時依賴項。這些一般必須手動肯定並添加到 spec 文件中。
BuildArch:此軟件爲該計算機體系結構所構建。若是省略此標籤,則將爲全部受支持的體系結構構建該軟件。值 noarch 表示該軟件與體系結構無關(例如 fpaste,它徹底是用 Python 編寫的)。
本節提供有關 fpaste 的常規信息:它是什麼,正在將什麼版本製做爲 RPM,其許可證等等。若是你已安裝 fpaste,並查看其元數據時,則能夠看到該 RPM 中包含的如下信息:
$ sudo dnf install fpaste $ rpm -qi fpaste Name : fpaste Version : 0.3.9.2 Release : 2.fc30 ...
RPM 會自動添加一些其餘標籤,以表明它所知道的內容。至此,咱們掌握了要爲其構建 RPM 的軟件的通常信息。接下來,咱們開始告訴 RPM 作什麼。
第二部分:準備構建
spec 文件的下一部分是準備部分,用 %prep 表明:
%prep %autosetup
對於 fpaste,這裏惟一的命令是 %autosetup。這只是將 tar 檔案文件提取到一個新文件夾中,併爲下一部分的構建階段作好了準備。你能夠在此處執行更多操做,例如應用補丁程序,出於不一樣目的修改文件等等。若是你查看過 Python 的源 RPM 的內容,那麼你會在那裏看到許多補丁。這些都將在本節中應用。
一般,spec 文件中帶有 % 前綴的全部內容都是 RPM 以特殊方式解釋的宏或標籤。這些一般會帶有大括號,例如 %{example}。
第三部分:構建軟件
下一部分是構建軟件的位置,用 %build 表示。如今,因爲 fpaste 是一個簡單的純 Python 腳本,所以無需構建。所以,這裏是:
%build #nothing required
不過,一般來講,你會在此處使用構建命令,例如:
configure; make
構建部分一般是 spec 文件中最難的部分,由於這是從源代碼構建軟件的地方。這要求你知道該工具使用的是哪一個構建系統,該系統多是許多構建系統之一:Autotools、CMake、Meson、Setuptools(用於 Python)等等。每一個都有本身的命令和語法樣式。你須要充分了解這些才能正確構建軟件。
第四部分:安裝文件
軟件構建後,須要在 %install 部分中安裝它:
%install mkdir -p %{buildroot}%{_bindir} make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
在構建 RPM 時,RPM 不會修改你的系統文件。在一個能夠正常運行的系統上添加、刪除或修改文件的風險太大。若是發生故障怎麼辦?所以,RPM 會建立一個專門打造的文件系統並在其中工做。這稱爲 buildroot。 所以,在 buildroot 中,咱們建立由宏 %{_bindir} 表明的 /usr/bin 目錄,而後使用提供的 Makefile 將文件安裝到其中。
至此,咱們已經在專門打造的 buildroot 中安裝了 fpaste 的構建版本。
第五部分:列出全部要包括在 RPM 中的文件
spec 文件其後的一部分是文件部分:%files。在這裏,咱們告訴 RPM 從該 spec 文件建立的檔案文件中包含哪些文件。fpaste 的文件部分很是簡單:
%files %{_bindir}/%{name} %doc README.rst TODO %{_mandir}/man1/%{name}.1.gz %license COPYING
請注意,在這裏,咱們沒有指定 buildroot。全部這些路徑都是相對路徑。%doc 和 %license命令作的稍微多一點,它們會建立所需的文件夾,並記住這些文件必須放在那裏。
RPM 很聰明。例如,若是你在 %install 部分中安裝了文件,但未列出它們,它會提醒你。
第六部分:在變動日誌中記錄全部變動
Fedora 是一個基於社區的項目。許多貢獻者維護或共同維護軟件包。所以,當務之急是不要被軟件包作了哪些更改所搞混。爲了確保這一點,spec 文件包含的最後一部分是變動日誌 %changelog:
%changelog * Thu Jul 25 2019 Fedora Release Engineering < ...> - 0.3.9.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild * Thu Jan 31 2019 Fedora Release Engineering < ...> - 0.3.9.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild * Tue Jul 24 2018 Ankur Sinha - 0.3.9.2-1 - Update to 0.3.9.2 * Fri Jul 13 2018 Fedora Release Engineering < ...> - 0.3.9.1-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild * Wed Feb 07 2018 Fedora Release Engineering < ..> - 0.3.9.1-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild * Sun Sep 10 2017 Vasiliy N. Glazov < ...> - 0.3.9.1-2 - Cleanup spec * Fri Sep 08 2017 Ankur Sinha - 0.3.9.1-1 - Update to latest release - fixes rhbz 1489605 ... ....
spec 文件的每項變動都必須有一個變動日誌條目。如你在此處看到的,雖然我以維護者身份更新了該 spec 文件,但其餘人也作過更改。清楚地記錄變動內容有助於全部人知道該 spec 文件的當前狀態。對於系統上安裝的全部軟件包,均可以使用 rpm 來查看其更改日誌:
$ rpm -q --changelog fpaste
構建 RPM
如今咱們準備構建 RPM 包。若是要繼續執行如下命令,請確保遵循上一篇文章中的步驟設置系統以構建 RPM。咱們將 fpaste 的 spec 文件放置在 ~/rpmbuild/SPECS 中,將源代碼檔案文件存儲在 ~/rpmbuild/SOURCES/ 中,如今能夠建立源 RPM 了:
$ cd ~/rpmbuild/SPECS $ wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec $ cd ~/rpmbuild/SOURCES $ wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz $ cd ~/rpmbuild/SOURCES $ rpmbuild -bs fpaste.spec Wrote: /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
讓咱們看一下結果:
$ ls ~/rpmbuild/SRPMS/fpaste* /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm $ rpm -qpl ~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm fpaste-0.3.9.2.tar.gz fpaste.spec
咱們看到源 RPM 已構建。讓咱們同時構建源 RPM 和二進制 RPM:
$ cd ~/rpmbuild/SPECS $ rpmbuild -ba fpaste.spec .. .. ..
RPM 將向你顯示完整的構建輸出,並在咱們以前看到的每一個部分中詳細說明它的工做。此「構建日誌」很是重要。當構建未按預期進行時,咱們的打包人員將花費大量時間來遍歷它們,以跟蹤完整的構建路徑來查看出了什麼問題。
就是這樣!準備安裝的 RPM 應該位於如下位置:
$ ls ~/rpmbuild/RPMS/noarch/
fpaste-0.3.9.2-3.fc30.noarch.rpm
歸納
咱們已經介紹瞭如何從 spec 文件構建 RPM 的基礎知識。這毫不是一份詳盡的文檔。實際上,它根本不是文檔。它只是試圖解釋幕後的運做方式。簡短回顧一下:
RPM 有兩種類型:源 RPM 和 二進制 RPM。
二進制 RPM 包含要安裝以使用該軟件的文件。
源 RPM 包含構建二進制 RPM 所需的信息:完整的源代碼,以及 spec 文件中的有關如何構建 RPM 的說明。
spec 文件包含多個部分,每一個部分都有其本身的用途。 在這裏,咱們已經在安裝好的 Fedora 系統中本地構建了 RPM。雖然這是個基本的過程,但咱們從存儲庫中得到的 RPM 是創建在具備嚴格配置和方法的專用服務器上的,以確保正確性和安全性。這個 Fedora 打包流程將在之後的文章中討論。
你想開始構建軟件包,並幫助 Fedora 社區維護咱們提供的大量軟件嗎?你能夠從這裏開始加入軟件包集合維護者。
若有任何疑問,請發佈到 Fedora 開發人員郵件列表,咱們隨時樂意爲你提供幫助!
via: https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/
做者:Ankur Sinha FranciscoD 譯者:wxy 校對:wxy