Pages

搜尋網誌

Monday, December 3, 2018

在 CentOS / RedHat 上從 Source 構建 RPM 包的七個步驟

有時您也許有權訪問開源應用程序原始碼,但可能沒有 RPM 文件可以在系統上安裝它。
在這種情況下,您可以編譯原始碼並從原始碼安裝應用程序,或者自己從原始碼構建 RPM 文件,並使用 RPM 文件來安裝應用程序。
可能還存在您要為您開發的應用程序構建自定義 RPM 包的情況。
本文介紹了如何從原始碼構建 RPM 包。

為了構建 RPM,您將需要原始碼,這通常意味著壓縮的 tar 文件也包含 SPEC 文件。
SPEC 文件通常包含有關如何構建 RPM,哪些文件是軟件包以及應安裝位置的說明。
RPM 在構建過程中執行以下任務。
  1. 執行 spec 文件的 prep 部分中提到的命令和巨集。
  2. 檢查文件列表的內容
  3. 執行 spec 文件的 build 部分中的命令和巨集。文件列表中的巨集也在此步驟中執行。
  4. 創建二進制包文件
  5. 創建源包文件
一旦RPM執行上述步驟,它就會創建二進制包文件和源包文件。
二進制包文件包含所有源文件以及安裝或卸載軟件包的任何其他信息。
它通常啟用了安裝特定於平台的軟件包的所有選項。二進制包文件包含為特定體系結構編譯的完整應用程序或函數庫。源包通常由原始壓縮 tar 文件,spec 文件和創建二進制包文件所需的補丁組成。
讓我們看看如何使用tar文件創建簡單的源和 BIN RPM包。
如果您不熟悉rpm軟件包,您可能首先想了解如何使用 rpm 命令在 CentOS 或 RedHat 上安裝,升級和刪除軟件包。

1.安裝 rpm-build Package

要根據我們剛剛創建的spec文件構建rpm文件,我們需要使用 rpmbuild 命令。
rpmbuild 命令是 rpm-build 包的一部分。安裝如下圖所示。
#yum install rpm-build
rpm-build 依賴於以下包。如果您尚未安裝這些,yum將自動為您安裝這些依賴項。

elfutils-libelf
rpm
rpm-libs
rpm-python

2. RPM Build Directories

rpm-build 將自動創建將在 RPM 構建期間使用的以下目錄結構。
# ls -lF /root/rpmbuild/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILD/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILDROOT/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 RPMS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SOURCES/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SPECS/
drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SRPMS/
注意:使用 rpmbuild 軟件包時,上述目錄結構適用於 CentOS 和 RedHat。您也可以使用 /usr/src/redhat 目錄,但需要在 rpm 構建期間相應地更改 topdir 參數。如果您在 SuSE Enterprise Linux 上執行此操作,請使用 /usr/src/packages 目錄。
如果要使用自己的目錄結構而不是 /root/rpmbuild,可以使用以下選項之一:
  • 使用 -buildroot 選項並在 rpmbuild 期間指定自定義目錄
  • 在 rpmrc 文件或 rpmmacros 文件中指定 topdir 參數。

3.下載原始碼 tar 文件

接下來,下載要構建的包的源 tar 文件,並將其保存在 SOURCES 目錄下。
在這個例子中,我使用了 icecase 開源應用程序的原始碼,這是一個用於流式多媒體的服務器軟件。但是,為任何其他應用程序構建 RPM 的步驟完全相同。您只需下載要嘗試構建的 RPM 的相應原始碼。
# cd /root/rpmbuild/SOURCES/

# wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz

# ls -l
-rw-r--r--. 1 root root 1161774 Jun 11  2012 icecast-2.3.3.tar.gz

4.創建 SPEC 文件

在此步驟中,我們通過創建 spec 文件在構建過程中引導 RPM。spec 文件通常由以下八個不同部分組成:
  1. 前導碼 - 前導碼部分包含有關正在構建的包的信息,並定義對包的任何依賴性。通常,前導碼由條目組成,每行一個,以標記後跟冒號開頭,然後是一些信息。
  2. %prep - 在本節中,我們準備用於構建過程的軟件。在此過程中刪除任何以前的構建,並擴展源文件(.tar)文件等。
  3. 另一個關鍵的事情是要了解有預定義的巨集可用於執行構建 rpm 的各種快捷方式選項。當您嘗試構建任何復雜的包時,您可能正在使用此巨集。在下面的示例中,我使用了一個名為 %setup 的巨集來刪除任何以前的版本,解壓縮源文件並更改文件的所有權。您還可以使用 %prep 部分下的 sh 腳本來執行此操作,但 %setup 巨集通過使用預定義的 sh 腳本簡化了該過程。
  4. %description - 描述部分通常包含有關包的描述。
  5. %build - 這是負責執行構建的部分。通常 %build 部分是 sh 腳本。
  6. %install - %install 部分也作為 sh 腳本執行,就像 %prep 和 %build 一樣。這是用於安裝的步驟。
  7. %files - 此部分包含作為程序包一部分的文件列表。如果文件不是 %files 部分的一部分,那麼它將不在包中。需要完整路徑,您可以在此部分中設置文件的屬性和所有權。
  8. %clean - 此部分指示 RPM 清理不屬於應用程序正常構建區域的任何文件。讓我們舉一個例子,如果應用程序在 /tmp/ 中創建一個臨時目錄結構作為其構建的一部分,它將不會被刪除。通過在 %clean 部分中添加 sh 腳本,可以在構建過程完成後刪除該目錄。
這是我為 icecast 應用程序創建的用於構建 RPM 文件的 SPEC 文件。
# cat /root/rpmbuild/SPECS/icecast.spec
Name:           icecast
Version:        2.3.3
Release:        0
Summary:        Xiph Streaming media server that supports multiple formats.
Group:          Applications/Multimedia
License:        GPL
URL:            http://www.icecast.org/
Vendor:         Xiph.org Foundation team@icecast.org
Source:         http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz
Prefix:         %{_prefix}
Packager:  Karthik
BuildRoot:      %{_tmppath}/%{name}-root

%description
Icecast is a streaming media server which currently supports Ogg Vorbis
and MP3 audio streams. It can be used to create an Internet radio
station or a privately running jukebox and many things in between.
It is very versatile in that new formats can be added relatively
easily and supports open standards for commuincation and interaction.

%prep
%setup -q -n %{name}-%{version}

%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etc

make

%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name}

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README AUTHORS COPYING NEWS TODO ChangeLog
%doc doc/*.html
%doc doc/*.jpg
%doc doc/*.css
%config(noreplace) /etc/%{name}.xml
%{_bindir}/icecast
%{_prefix}/share/icecast/*

%changelog

In this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background.

cd /usr/src/redhat/BUILD
rm -rf icecast
gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf -
if [ $? -ne 0 ]; then
  exit $?
fi
cd icecast
cd /usr/src/redhat/BUILD/icecast
chown -R root.root .
chmod -R a+rX,g-w,o-w .
在 %build 部分中,您將看到帶有配置選項的 CFLAGS,它定義了在 RPM 安裝期間可以使用的選項和前綴選項,安裝所需的強制目錄以及需要在其上複製系統文件的 sysconfig 目錄。
在該行下方,您將看到 make 實用程序,它確定需要編譯的文件列表並適當地編譯它們。
在 %install 部分中,%install 下面的 “make install” 行用於獲取上一步編譯的二進製文件,並將它們安裝或複製到適當的位置,以便可以訪問它們。

5.使用 rpmbuild 創建 RPM 文件

準備好 SPEC 文件後,您可以使用 rpm -b 命令開始構建 rpm。-b 選項用於執行構建過程的所有階段。如果您在此階段發現任何錯誤,則需要在重新嘗試之前解決此問題。錯誤通常是庫依賴項,您可以根據需要下載並安裝它。
# cd /root/rpmbuild/SPECS

# rpmbuild -ba icecast.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf icecast-2.3.3
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd icecast-2.3.3
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ CFLAGS='-O2 -g'
+ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
..
..
..
Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ '[' /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64
+ exit 0
注意:如果您使用的是 SuSE Linux,如果 rpmbuild 不可用,請嘗試使用 “rpm -ba” 構建 rpm 包。
在上面的 rpmbuild 安裝過程中,您可能會注意到以下錯誤消息:
錯誤 1:找不到 XSLT 配置
checking for xslt-config... no
configure: error: XSLT configuration could not be found
error: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
解決方案 1:安裝 libxstl-devel
對於 xslt-config,您需要安裝 libxstl-devel 包,如下所示。
yum install libxstl-devel
這還將安裝以下依賴項:
  • libgcrypt
  • libgcrypt-devel
  • libgpg-error-devel
錯誤 2:libvorbis 錯誤
checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installed
error: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)
解決方案 2:安裝 libvorbis-devel
對於 Ogg Vorbis v1.0,安裝 libvorbis-devel 包,如下所示:
yum install libvorbis-devel
這還將安裝以下依賴項:
  • libogg
  • libogg-devel
  • libvorbis

6.驗證源和二進制 RPM 文件

完成 rpmbuild 後,您可以驗證源 rpm 和二進制 rpm 是否在以下目錄中創建。
# ls -l /root/rpmbuild/SRPMS/
-rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm

# ls -l /root/rpmbuild/RPMS/x86_64/
-rw-r--r--. 1 root root 349181 Feb  4 12:54 icecast-2.3.3-0.x86_64.rpm

7.安裝 RPM 文件以進行驗證

最後一步,您可以安裝二進制rpm以驗證它是否已成功安裝並且所有依賴項都已解決。
# rpm -ivvh /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: ============== /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key
D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key
D: loading keyring from rpmdb
D: opening  db environment /var/lib/rpm cdb:mpool:joinenv
D: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0
D:  read h#     210 Header sanity check: OK
D: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyring
D: Using legacy gpg-pubkey(s) from rpmdb
D: Expected size:       349181 = lead(96)+sigs(180)+pad(4)+data(348901)
D:   Actual size:       349181
D: ========== relocations
D:      added binary package [0]
D: found 0 source and 1 binary packages
D: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2
..
..
完成上述安裝後,您可以驗證是否已成功安裝自定義創建的 rpm 文件,如下所示。
# rpm -qa icecast
icecast-2.3.3-0.x86_64
https://www.thegeekstuff.com/2015/02/rpm-build-package-example/ 

by KARTHIKEYAN SADHASIVAM on FEBRUARY 4, 2015