1. 程式人生 > >RPM 打包指南系列 一

RPM 打包指南系列 一

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 CentOSFedora 上的包管理系統。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 位元組編譯語言需要編譯成位元組程式碼,然後由語言虛擬機器執行