溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

RPM 的 spec文件如何編寫

發(fā)布時(shí)間:2021-11-03 16:01:13 來(lái)源:億速云 閱讀:121 作者:柒染 欄目:建站服務(wù)器

這篇文章給大家介紹RPM 的 spec文件如何編寫,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

這里深入研究了 spec 文件,該文件中包含了有關(guān)如何構(gòu)建 RPM 的指令。

了解源代碼

在開(kāi)始編寫 spec 文件之前,你需要對(duì)要打包的軟件有所了解。在這里,你正在研究 fpaste,這是一個(gè)非常簡(jiǎn)單的軟件。它是用 Python 編寫的,并且是一個(gè)單文件 腳本。當(dāng)它發(fā)布新版本時(shí),可在 Pagure 上找到:https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz。

如該檔案文件所示,當(dāng)前版本為 0.3.9.2。下載它,以便你查看該檔案文件中的內(nèi)容:

$ 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

你要安裝的文件是:

fpaste.py:應(yīng)該安裝到 /usr/bin/。
docs/man/en/fpaste.1:手冊(cè),應(yīng)放到 /usr/share/man/man1/。
COPYING:許可證文本,應(yīng)放到 /usr/share/license/fpaste/。
README.rst、TODO:放到 /usr/share/doc/fpaste/ 下的其它文檔。

這些文件的安裝位置取決于文件系統(tǒng)層次結(jié)構(gòu)標(biāo)準(zhǔn)(FHS)。要了解更多信息,可以在這里閱讀:http://www.pathname.com/fhs/ 或查看 Fedora 系統(tǒng)的手冊(cè)頁(yè):

$ man hier

第一部分:要構(gòu)建什么?

現(xiàn)在我們知道了源文件中有哪些文件,以及它們要存放的位置,讓我們看一下 spec 文件。你可以在此處查看這個(gè)完整的文件:https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec。

這是 spec 文件的第一部分:

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 等稱為標(biāo)簽,它們定義在 RPM 中。這意味著你不能只是隨意寫點(diǎn)標(biāo)簽,RPM 無(wú)法理解它們!需要注意的標(biāo)簽是:

Source0:告訴 RPM 該軟件的源代碼檔案文件所在的位置。
Requires:列出軟件的運(yùn)行時(shí)依賴項(xiàng)。RPM 可以自動(dòng)檢測(cè)很多依賴項(xiàng),但是在某些情況下,必須手動(dòng)指明它們。運(yùn)行時(shí)依賴項(xiàng)是系統(tǒng)上必須具有的功能(通常是軟件包),才能使該軟件包起作用。這是 dnf 在安裝此軟件包時(shí)檢測(cè)是否需要拉取其他軟件包的方式。
BuildRequires:列出了此軟件的構(gòu)建時(shí)依賴項(xiàng)。這些通常必須手動(dòng)確定并添加到 spec 文件中。
BuildArch:此軟件為該計(jì)算機(jī)體系結(jié)構(gòu)所構(gòu)建。如果省略此標(biāo)簽,則將為所有受支持的體系結(jié)構(gòu)構(gòu)建該軟件。值 noarch 表示該軟件與體系結(jié)構(gòu)無(wú)關(guān)(例如 fpaste,它完全是用 Python 編寫的)。

本節(jié)提供有關(guān) fpaste 的常規(guī)信息:它是什么,正在將什么版本制作為 RPM,其許可證等等。如果你已安裝 fpaste,并查看其元數(shù)據(jù)時(shí),則可以看到該 RPM 中包含的以下信息:

$ sudo dnf install fpaste
$ rpm -qi fpaste
Name        : fpaste
Version     : 0.3.9.2
Release     : 2.fc30
...

RPM 會(huì)自動(dòng)添加一些其他標(biāo)簽,以代表它所知道的內(nèi)容。至此,我們掌握了要為其構(gòu)建 RPM 的軟件的一般信息。接下來(lái),我們開(kāi)始告訴 RPM 做什么。

第二部分:準(zhǔn)備構(gòu)建

spec 文件的下一部分是準(zhǔn)備部分,用 %prep 代表:

%prep
%autosetup

對(duì)于 fpaste,這里唯一的 命令是 %autosetup。這只是將 tar 檔案文件提取到一個(gè)新文件夾中,并為下一部分的構(gòu)建階段做好了準(zhǔn)備。你可以在此處執(zhí)行更多操作,例如應(yīng)用補(bǔ)丁程序,出于不同目的修改文件等等。如果你查看過(guò) Python 的源 RPM 的內(nèi)容,那么你會(huì)在那里看到許多補(bǔ)丁。這些都將在本節(jié)中應(yīng)用。

通常,spec 文件中帶有 % 前綴的所有內(nèi)容都是 RPM 以特殊方式解釋的宏或標(biāo)簽。這些通常會(huì)帶有大括號(hào),例如 %{example}。

第三部分:構(gòu)建軟件

下一部分是構(gòu)建軟件的位置,用 %build 表示。現(xiàn)在,由于 fpaste 是一個(gè)簡(jiǎn)單的純 Python  腳本,因此無(wú)需構(gòu)建。因此,這里是:

%build
#nothing required

不過(guò),通常來(lái)說(shuō),你會(huì)在此處使用構(gòu)建 命令,例如:

configure; make

構(gòu)建部分通常是 spec 文件中最難的部分,因?yàn)檫@是從源代碼構(gòu)建軟件的地方。這要求你知道該工具使用的是哪個(gè)構(gòu)建系統(tǒng),該系統(tǒng)可能是許多構(gòu)建系統(tǒng)之一:Autotools、CMake、Meson、Setuptools(用于 Python)等等。每個(gè)都有自己的命令和語(yǔ)法樣式。你需要充分了解這些才能正確構(gòu)建軟件。

第四部分:安裝文件

軟件構(gòu)建后,需要在 %install 部分中安裝它:

%install
mkdir -p %{buildroot}%{_bindir}
make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}

在構(gòu)建 RPM 時(shí),RPM 不會(huì)修改你的系統(tǒng)文件。在一個(gè)可以正常運(yùn)行的系統(tǒng)上添加、刪除或修改文件的風(fēng)險(xiǎn)太大。如果發(fā)生故障怎么辦?因此,RPM 會(huì)創(chuàng)建一個(gè)專門打造的文件系統(tǒng)并在其中工作。這稱為 buildroot。 因此,在 buildroot 中,我們創(chuàng)建由宏 %{_bindir} 代表的 /usr/bin 目錄,然后使用提供的 Makefile 將文件安裝到其中。

至此,我們已經(jīng)在專門打造的 buildroot 中安裝了 fpaste 的構(gòu)建版本。

第五部分:列出所有要包括在 RPM 中的文件

spec 文件其后的一部分是文件部分:%files。在這里,我們告訴 RPM 從該 spec 文件創(chuàng)建的檔案文件中包含哪些文件。fpaste 的文件部分非常簡(jiǎn)單:

%files
%{_bindir}/%{name}
%doc README.rst TODO
%{_mandir}/man1/%{name}.1.gz
%license COPYING

請(qǐng)注意,在這里,我們沒(méi)有指定 buildroot。所有這些路徑都是相對(duì)路徑。%doc 和 %license命令做的稍微多一點(diǎn),它們會(huì)創(chuàng)建所需的文件夾,并記住這些文件必須放在那里。

RPM 很聰明。例如,如果你在 %install 部分中安裝了文件,但未列出它們,它會(huì)提醒你。

第六部分:在變更日志中記錄所有變更

Fedora 是一個(gè)基于社區(qū)的項(xiàng)目。許多貢獻(xiàn)者維護(hù)或共同維護(hù)軟件包。因此,當(dāng)務(wù)之急是不要被軟件包做了哪些更改所搞混。為了確保這一點(diǎn),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 文件的每項(xiàng)變更都必須有一個(gè)變更日志條目。如你在此處看到的,雖然我以維護(hù)者身份更新了該 spec 文件,但其他人也做過(guò)更改。清楚地記錄變更內(nèi)容有助于所有人知道該 spec 文件的當(dāng)前狀態(tài)。對(duì)于系統(tǒng)上安裝的所有軟件包,都可以使用 rpm 來(lái)查看其更改日志:

$ rpm -q --changelog fpaste

構(gòu)建 RPM

現(xiàn)在我們準(zhǔn)備構(gòu)建 RPM 包。如果要繼續(xù)執(zhí)行以下命令,請(qǐng)確保遵循上一篇文章中的步驟設(shè)置系統(tǒng)以構(gòu)建 RPM。我們將 fpaste 的 spec 文件放置在 ~/rpmbuild/SPECS 中,將源代碼檔案文件存儲(chǔ)在 ~/rpmbuild/SOURCES/ 中,現(xiàn)在可以創(chuàng)建源 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

讓我們看一下結(jié)果:

$ 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 已構(gòu)建。讓我們同時(shí)構(gòu)建源 RPM 和二進(jìn)制 RPM:

$ cd ~/rpmbuild/SPECS
$ rpmbuild -ba fpaste.spec
..
..
..

RPM 將向你顯示完整的構(gòu)建輸出,并在我們之前看到的每個(gè)部分中詳細(xì)說(shuō)明它的工作。此“構(gòu)建日志”非常重要。當(dāng)構(gòu)建未按預(yù)期進(jìn)行時(shí),我們的打包人員將花費(fèi)大量時(shí)間來(lái)遍歷它們,以跟蹤完整的構(gòu)建路徑來(lái)查看出了什么問(wèn)題。

就是這樣!準(zhǔn)備安裝的 RPM 應(yīng)該位于以下位置:

$ ls ~/rpmbuild/RPMS/noarch/
fpaste-0.3.9.2-3.fc30.noarch.rpm

概括

我們已經(jīng)介紹了如何從 spec 文件構(gòu)建 RPM 的基礎(chǔ)知識(shí)。這絕不是一份詳盡的文檔。實(shí)際上,它根本不是文檔。它只是試圖解釋幕后的運(yùn)作方式。簡(jiǎn)短回顧一下:

RPM 有兩種類型:源 RPM 和 二進(jìn)制 RPM。
二進(jìn)制 RPM 包含要安裝以使用該軟件的文件。
源 RPM 包含構(gòu)建二進(jìn)制 RPM 所需的信息:完整的源代碼,以及 spec 文件中的有關(guān)如何構(gòu)建 RPM 的說(shuō)明。
spec 文件包含多個(gè)部分,每個(gè)部分都有其自己的用途。 在這里,我們已經(jīng)在安裝好的 Fedora 系統(tǒng)中本地構(gòu)建了 RPM。雖然這是個(gè)基本的過(guò)程,但我們從存儲(chǔ)庫(kù)中獲得的 RPM 是建立在具有嚴(yán)格配置和方法的專用服務(wù)器上的,以確保正確性和安全性。這個(gè) Fedora 打包流程將在以后的文章中討論。

你想開(kāi)始構(gòu)建軟件包,并幫助 Fedora 社區(qū)維護(hù)我們提供的大量軟件嗎?你可以從這里開(kāi)始加入軟件包集合維護(hù)者。

關(guān)于RPM 的 spec文件如何編寫就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI