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 字節編譯語言需要編譯成字節代碼,然后由語言虛擬機執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM