天天看點

【rpm】源碼包制作rpm包|修改rpm、重新制作rpm包

打rpm 包需要的東西有 源碼、spec檔案(打rpm包的腳本)、rpmbuild工具。

安裝rpmbuild

$yum install rpmbuild
$yum install rpmdevtools 
$rpmdev-setuptree      

rpmbuild制作rpm 包

1,整理源碼

tar -zcvf hello-1.0.tar.gz hello-1.0

hello-1.0 源碼打包為.tar.gz壓縮包,放到 SOURCE 檔案夾下。我門的源碼可能是一個tar.gz 的包、也可能是幾個檔案。

tar.gz源碼包的名字格式應該為 helloword-1.0.0.tar.gz (其實就是名字-版本号.tar.gz)

2,編寫spec檔案

在SPECS檔案夾下建立 xxx.spec 打包腳本,其實也就是把我門的源碼編譯打包成rpm 的一個過程。

(有個rpmdev-newspec工具可以自動生成一個.spec 模闆)

vi  xxx.spec 

Name:           hellorpm           #名字為源碼tar.gz 包的名字 
Version:        1.0.0             #版本号,一定要與tar.gz包的一緻哦 
Release:        1%{?dist}         #釋出号,也就是第幾次制作rpm 
Summary:       helloword   #描述資訊/軟體包簡介,最好不超過50字元 

License:        GPL                   #許可,GPL還是BSD等  
URL:            #自定義該資訊,可以寫一個網址 
Packager:       abel 
Source0:        %{name}-%{version}.tar.gz   
#定義用到的source,也就是你的源碼

BuildRoot:      %_topdir/BUILDROOT         
#這個是軟體make install 的測試安裝目錄.

BuildRequires:  gcc,make                           #制作過程中用到的軟體包 
Requires:       python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7  #軟體運作依賴的軟體包,也可以指定最低版本如 bash >= 1.1.1 
%description                #描述,随便寫                 
%prep                          #打包開始                    
%setup -q                      #這個作用靜默模式解壓并cd                               


%build              #編譯制作階段,主要目的就是編譯,如果不用編譯就為空 
./configure \                                     
 %{?_smp_mflags}          #make後面的意思是:如果就多處理器的話make時并行編譯 

%install                        #安裝階段//安裝之前需初始化安裝目錄                        
 rm -rf %{buildroot}             #先删除原來的安裝的,如果你不是第一次安裝的話 
 cp -rp %_topdir/BUILD/%{name}-%{version}/*  $RPM_BUILD_ROOT 
#将需要需要打包的檔案從BUILD 檔案夾中拷貝到BUILDROOT檔案夾下。

#下面的幾步pre、post、preun、postun 沒必要可以不寫 
%pre        #rpm安裝前制行的腳本 

%post       #安裝後執行的腳本//安裝之後需要執行的動作 
cp  /usr/local/httpd/bin/apachectl /etc/init.d/myhttpd
sed -i '1a # chkconfig:  2345 85 15' /etc/init.d/myhttpd

%preun      #解除安裝前執行的腳本//解除安裝該rpm包所執行的一些操作
/etc/init.d/myhttpd stop
%postun     #解除安裝後執行的腳本 

%clean #清理段,删除buildroot 
rm -rf %{buildroot} 

%files  #rpm要包含的檔案//安裝之後生成的檔案 
%defattr (-,root,root,-)   #設定預設權限,如果下面沒有指定權限,則繼承預設 
/etc/hello/word/helloword.c           #将你需要打包的檔案或目錄寫下來
/usr/local/httpd/bin/*
%dir  /usr/local/httpd/logs
%doc  /usr/local/httpd/man/*
%doc  /usr/local/httpd/manual/*

###  7.chagelog section //定義一些日志檔案,可以使用:rpm -q  --changelog httpd檢視到
%changelog 
* Wed Mar 26 2014  zhangzhg <[email protected]> 2.2.25
- first rpm from  httpd-2.2.25      

注意:

以上階段如果沒有操作的話,為空,但是不能有空行,例如build階段為空應寫為

%build              
%install  
xxxxxxxx   
錯誤示例:
%build   

%install  
xxxxxxxx      

rpm包制作階段

【rpm】源碼包制作rpm包|修改rpm、重新制作rpm包

3, build rpm包

spec 檔案編寫好以後就可以進行打包了。

在SPECS檔案夾下執行指令:
rpmbuild -ba hello.spec

如果出錯了可以通過 不同的指令來看是在打包的那一步出了問題。

rpmbuild -ba spec_name.spec    <--編譯,既生成源碼src.rpm又生成二進制rpm 
rpmbuild -bb spec_name.spec    <--編譯,隻生二進制的rpm 
rpmbuild  
-bs 隻生成src的rpm 
-bp 執行到pre 
-bc 執行到 build段 
-bi 執行install段 
-bl 檢測有檔案沒包含 

可以先rpmbuild -bp ,再-bc 再-bi 如果沒問題,rpmbuild -ba 生成src包與二進制包。      

4, 安裝

rpmbuild -ivh hello.rpm

5, 查詢

rpm -qi hello

 rpm -qa|grep hello

修改rpm、重新制作rpm包

提取spec檔案

rpmrebuild -s helloworld.spec helloworld.x86_64.rpm

解壓原rpm包,得到helloworld

rpm2cpio helloworld.rpm|cpio -div

修改or替換helloworld裡面的内容

建立檔案夾/tmp/rpmbuild

mkdir /tmp/buildrpm

把helloworld和helloworld.spec 都放入其中<----------------------這一步很關鍵

cp -r helloworld helloworld.spec /tmp/buildrpm

重新編出rpm包

rpmbuild -ba --buildroot /tmp/buildrpm/ /tmp/buildrpm/helloworld.spec

rpmbuild的目錄和宏變量

預設工作路徑的确定,通常由在/usr/lib/rpm/macros這個檔案裡的一個叫做%_topdir的宏變量來定義。

在%_topdir目錄下一般需要建立6個目錄:

$_topdir /root/rpmbuild

目錄名 說明 macros中的宏名

BUILD 編譯rpm包的臨時目錄 %_builddir

BUILDROOT 編譯後生成的軟體臨時安裝目錄 %_buildrootdir

RPMS 最終生成的可安裝rpm包的所在目錄 %_rpmdir

SOURCES 所有源代碼和更新檔檔案的存放目錄 %_sourcedir

SPECS 存放SPEC檔案的目錄(重要) %_specdir

SRPMS 軟體最終的rpm源碼格式存放路徑(暫時忽略掉,别挂在心上) %_srcrpmdir

Spec檔案的宏定義:
rpmbuild --showrc | grep topdir #工作工廠中的房間目錄:_topdir /root/rpmbuild
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /root/rpmbuild

rpmbuild --showrc顯示所有的宏,以下劃線開頭:

一個下劃線:定義環境的使用情況,
二個下劃線:通常定義的是指令,
為什麼要定義宏,因為不同的系統,指令的存放位置可能不同,是以通過宏的定義找到指令的真正存放位置      

spec檔案資訊:

Name: 軟體包的名稱,在後面的變量中即可使用%{name}的方式引用
Summary: 軟體包的内容
Version: 軟體的實際版本号,例如:1.12.1等,後面可使用%{version}引用
Release: 釋出序列号,例如:1%{?dist},标明第幾次打包,後面可使用%{release}引用
Group: 軟體分組,建議使用:Applications/System
License: 軟體授權方式GPLv2
Source: 源碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用
BuildRoot: 這個是安裝或編譯時使用的臨時目錄,即模拟安裝完以後生成的檔案目錄:%_topdir/BUILDROOT 後面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟體的URI
Vendor: 打包組織或者人員
Patch: 更新檔源碼,可使用Patch1、Patch2等辨別多個更新檔,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個主要是為了解決今後安裝rpm包時,并不一定把軟體安裝到rpm中打包的目錄的情況。這樣,必須在這裡定義該辨別,并在編寫%install腳本的時候引用,才能實作rpm安裝時重新指定位置的功能
Prefix: %{_sysconfdir} 這個原因和上面的一樣,但由于%{_prefix}指/usr,而對于其他的檔案,例如/etc下的配置檔案,則需要用%{_sysconfdir}辨別
Requires: 該rpm包所依賴的軟體包名稱,可以用>=或<=表示大于或小于某一特定版本,例如:
libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号兩邊需用空格隔開,而不同軟體名稱也用空格分開

%description: 軟體的詳細說明
%define: 預定義的變量,例如定義日志路徑: _logpath /var/log/weblog
%prep: 預備參數,通常為 %setup -q
%build: 編譯參數 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
%install: 安裝步驟,此時需要指定安裝路徑,建立編譯時自動生成目錄,複制配置檔案至所對應的目錄中(這一步比較重要!)
%pre: 安裝前需要做的任務,如:建立使用者
%post: 安裝後需要做的任務 如:自動啟動的任務
%preun: 解除安裝前需要做的任務 如:停止任務
%postun: 解除安裝後需要做的任務 如:删除使用者,删除/備份業務資料
%clean: 清除上次編譯生成的臨時檔案,就是上文提到的虛拟目錄
%files: 設定檔案屬性,包含編譯檔案需要生成的目錄、檔案以及配置設定所對應的權限
%changelog: 修改曆史      

符号說明

什麼是 1%{?dist} : 如果%{dist}未定義傳回1,否則傳回1%{dist},

if 0%{?flag}; then

foo

fi

如果%{flag}被定義了,條件語句為:0%{flag},執行if block; 反之,條件語句為:0, 不執行if block。

注意:%{?flag}前必須加0,否則如果%{?flag}未定義,if語句停止執行并退出。

%{?flag: …}:如果%{flag}被定義,則展開"…"部分

作者:weiee

連結:https://www.jianshu.com/p/f1e36e4a152c

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

Note:

rpm --eval %{kernel_module_package_buildreqs}->kernel-devel

rpm --eval %{kernel_module_package} 會輸出一些關于制作linux驅動的一些代碼和一些依賴

重要的是包含了%files 路徑,%files包含了需要打包進入rpm包裡的檔案,如果是 / 開頭那麼其實是BUILDROOT路徑

制作的時候%install 是安裝到~/rpmbuild/BUILDROOT的,最後釋出rpm後運作yum install rpm會

把驅動安裝到lib/modules/RPM_BUILD_ROOT export INSTALL_MOD_DIR=updates 這兩句話說明了安裝的時候的路徑,是~/rpmbuild/BUILDROOT ,最後裡面會生成對應的lib/modules/$(uname -r)/updates 下面