1. 程式人生 > 實用技巧 >linux RPM 打包流程

linux RPM 打包流程

------------恢復內容開始------------

1.因為打RPM包需要 rpmbuild 命令,所以需要先安裝 rpmbuild 相應工具,安裝過程可在網上查詢;

2.執行rpmdev-setuptree 即可在自動當前使用者的 $HOME 目錄下建立 RPM 相關的資料夾,也可手動建立;

 1 [xx@localhost ~]$ rpmbuild xx.spec
 2 錯誤:stat ~/xx.spec 失敗:沒有那個檔案或目錄
 3 [xx@localhost ~]$ tree ~/rpmbuild/
 4 rpmbuild/
 5 ├── BUILD
 6 ├── BUILDROOT
7 ├── RPMS 8 ├── SOURCES 9 ├── SPECS 10 └── SRPMS


BUILD:原始碼包被解壓至此,並在該目錄的子目錄完成編譯,巨集為 %_builddir

BUILDROOT:儲存 %install 階段安裝的檔案,巨集為 %_buildrootdir

RPMS:生成/儲存二進位制 RPM 包,巨集為 %_rpmdir

SOURCES:儲存原始碼包(如 .tar 包)和所有 patch 補丁,巨集為 %_sourcedir

SPECS:儲存 RPM 包配置(.spec)檔案,巨集為 %_specdir

SRPMS:生成/儲存原始碼 RPM 包(SRPM),巨集為 %_srcrpmdir

~/rpmbuild 的巨集為 %_topdir

3.建立 SPEC 檔案如下所示:

[xxx@localhost rpmbuild]$ rpmdev-newspec xxx.spec
xxx.spec created; type minimal, rpm version >= 4.12.

4.將 SPEC 檔案放在 ~rpmbuild/SPECS/ 下面,然後編輯 SPEC 檔案,如下所示:

Name:
Version:
Release:
Summary:
License:
URL:
Source0:%description

%prep

%build
%pre
%install
%post
%files %clean

%preun

%postun
%changelog * Fri Aug 7 2020 -

5.安裝的各個階段說明:

%prep階段 - 預處理,主要對原始碼包進行解壓和打補丁

  一般使用 %setup -c 或者 %setup -q 命令來解壓原始碼包,直接會將檔案解壓到%{_builddir}

%build階段 - 對原始碼包進行編譯

  編譯階段,非 GNU configure 配置的程式可以不關注這個階段

%install階段 - 將軟體安裝到虛擬根目錄, 同時 Install 階段也有如下階段

  %pre階段 - 安裝前

  %post階段 - 安裝後

  %preun階段 - 解除安裝前

  %postun階段 - 解除安裝後

這個階段主要從%{_builddir}複製相關檔案到%{buildroot}(虛擬根目錄)目錄,如下所示:

rm -rf $RPM_BUILD_ROOT
cp -rf xxx $RPM_BUILD_ROOT

%files階段-列出被打包的檔案和目錄

  首先要設定預設許可權,同時要列出打包的目錄和檔案,設定預設許可權的命令如下:

%defattr(<檔案許可權>, <使用者>, <使用者組>, <目錄許可權>)

  第 4 個引數通常會省略。常規用法為%defattr(-,root,root,-),其中 “-” 表示預設許可權。

  在列出檔案的目錄時,儘量使用內建巨集來代替目錄名,常用的內建巨集如下所示:

%{_sysconfdir}        /etc
%{_prefix}            /usr
%{_exec_prefix}       %{_prefix}
%{_bindir}            %{_exec_prefix}/bin
%{_lib}               lib (lib64 on 64bit systems)
%{_libdir}            %{_exec_prefix}/%{_lib}
%{_libexecdir}        %{_exec_prefix}/libexec
%{_sbindir}           %{_exec_prefix}/sbin
%{_sharedstatedir}    /var/lib
%{_datadir}           %{_prefix}/share
%{_includedir}        %{_prefix}/include
%{_oldincludedir}     /usr/include
%{_infodir}           /usr/share/info
%{_mandir}            /usr/share/man
%{_localstatedir}     /var
%{_initddir}          %{_sysconfdir}/rc.d/init.d 
%{_topdir}            %{getenv:HOME}/rpmbuild
%{_builddir}          %{_topdir}/BUILD
%{_rpmdir}            %{_topdir}/RPMS
%{_sourcedir}         %{_topdir}/SOURCES
%{_specdir}           %{_topdir}/SPECS
%{_srcrpmdir}         %{_topdir}/SRPMS
%{_buildrootdir}      %{_topdir}/BUILDROOT
%{_var}               /var
%{_tmppath}           %{_var}/tmp
%{_usr}               /usr
%{_usrsrc}            %{_usr}/src
%{_docdir}            %{_datadir}/doc
%{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT       %{buildroot}
%clean階段 - 完成後的一些清理工作

  主要是清理 %{_builddir}和%{_buildrootdir}兩個目錄裡的中間檔案

%changelog階段 -- 主要記錄每次打包時的修改日誌
%changelog
* Fri Aug  7 2020 - Your Name <[email protected]> - Release
- Update log1
* Fri Aug 7 2020 - Your Name <[email protected]> - Release
- Update log2