打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包制作階段
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 下面