RPM 打包指南
簡介
這個指南包括以下三個部分
如何准備用於 RPM 打包的源碼包
這是給沒有軟件開發背景的人准備的,參見 Preparing Software for Packaging
如何把源碼包打包進 RPM 包
這適用於需要將源碼包打包到 RPM 中的開發人員,參見 Packaging Software
高級打包技巧
這是處理高級 RPM 打包方案的參考資料,參閱 Advanced Topics
准備
完成這個教程需要准備以下的包
$ yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools
為什么需要 RPM 來打包呢
RPM 是運行在 Redhat
CentOS
和 Fedora
上的包管理系統。RPM 幫助你更簡單的分發,管理和更新軟件。很多軟件供應商通過傳統的壓縮包來分發軟件。但是,將軟件打包到 RPM 中有幾個優點,這些優點概述如下
安裝,重新安裝,刪除,升級和驗證包
用戶可以使用標准的包管理工具(例如 Yum 或者 PackageKit)來安裝,重新安裝,移除升級和驗證你的 RPM 包
使用已安裝軟件包的數據庫來查詢和驗證已安裝軟件包
因為 RPM 維護已安裝軟件包及其文件的數據庫,因此用戶可以輕松查詢和驗證其系統上的軟件包
使用元數據來描述包,安裝說明等
每個 RPM 軟件包都包含描述軟件包組件,版本,發行版,大小,項目 url,安裝說明等的元數據
將原始軟件打包為源包和二進制包
RPM允許您獲取原始軟件源並將其打包為用戶的源和二進制包。 在源包中,您擁有原始源以及所使用的任何修補程序以及完整的構建說明。 隨着軟件的新版本發布,此設計可以簡化軟件包的維護。
將包添加到 Yum 倉庫
你可以將軟件包添加到 yum 倉庫,是客戶端可以輕松查找和部署軟件
對包進行數字簽名
使用 GPG 簽名秘鑰,你可以對包進行數字簽名,以便用戶能夠驗證包的真實性
你的第一個 RPM 包
創建一個 RPM 包可能是很復雜的。這里有一個略過了一些步驟的完整的,簡化的 RPM 的 spec 文件。
Name: hello-world
Version: 1
Release: 1
Summary: Most simple RPM package
License: FIXME
%description
This is my first RPM package, which does nothing.
%prep
# we have no source, so nothing here
%build
cat > hello-world.sh <<EOF
#!/usr/bin/bash
echo Hello world
EOF
%install
mkdir -p %{buildroot}/usr/bin/
install -m 755 hello-world.sh %{buildroot}/usr/bin/hello-world.sh
%files
/usr/bin/hello-world.sh
%changelog
# let skip this for now
保存這個文件到 hello-world.spec
現在運行下面的命令
$ rpmdev-setuptree
$ rpmbuild -ba hello-world.spec
rpmdev-setuptree
創建了一些工作目錄,由於這些目錄永久存儲在 $HOME 中,因此不需要再次使用此命令。
rpmbuild
創建了一個實際的 RPM 包,這個命令的輸出可能如下
... [SNIP]
Wrote: /home/mirek/rpmbuild/SRPMS/hello-world-1-1.src.rpm
Wrote: /home/mirek/rpmbuild/RPMS/x86_64/hello-world-1-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.wgaJzv
+ umask 022
+ cd /home/mirek/rpmbuild/BUILD
+ /usr/bin/rm -rf /home/mirek/rpmbuild/BUILDROOT/hello-world-1-1.x86_64
+ exit 0
/home/mirek/rpmbuild/RPMS/x86_64/hello-world-1-1.x86_64.rpm
是你的第一個 RPM 包,他可以被系統安裝和測試。
准備打包的的軟件
本章介紹源代碼和創建軟件,它們是 RPM 包管理的必備步驟
什么是源碼?
Source code
是指計算機的人類可讀指令,描述了如何執行計算。源代碼用編程語言表示。
以下使用三個版本的 Hello world
程序,每個版本都使用不同的編程語言編寫。用這三種不同語言編寫的程序以不同的方式打包,涵蓋 RPM 打包程序的三個主要用例。
首先是用 bash
編寫:
bello
#!/bin/bash
printf "Hello World\n"
用 python
編寫:
pello.py
#!/usr/bin/env python
print("Hello World")
用 C
編寫:
cello.c
#include <stdio.h>
int main(void) {
printf("Hello World\n");
return 0;
}
三個程序的唯一目的都是在命令行輸出 Hello World
。
了解怎么編程對打包不是必須的,但是很有幫助
本地編譯代碼
Natively compiled
本地編譯是把編程語言編譯成機器代碼,生成二進制可執行文件。這種軟件可以獨立運行。
以這種方式構建的 RPM 包是適用於特定體系結構的。這意味着您在使用 64 位(x86_64)AMD 或 Intel 處理器的計算機上編譯此類軟件,則無法在 32 位(x86)AMD 或 Intel 處理器上執行。生成的包將在其名稱中指定體系結構。
解釋語言代碼
某些編程語言(如 bash 或 python)無法編譯為機器代碼。相反,它們程序的源代碼是由語言解釋器或語言虛擬機逐步執行的,無需事先轉換。
完全用解釋型語言編寫的軟件不是特定於體系結構的。因此,生成的 RPM 包名稱中將包含字符串 noarch
解釋型語言是可以 byte-compiled
或者 raw-interpreted
(字節編譯或者原始解釋)。這兩種類型在程序構建過程和包裝過程中有所不同。
Raw-interpreted programs
Raw-interpreted 原始解釋語言完全不需要編譯,它們由解釋器直接執行
Byte-compiled programs
Byte-compiled programs 字節編譯語言需要編譯成字節代碼,然后由語言虛擬機執行