目錄
前言
安裝rpmbuild
rpmbuild制作rpm 包
同時(shí)生成devel包
阻止rpmbuid打包時(shí)strip程序/庫
修改rpm、重新制作rpm包
RPM 打包 工具
SPEC文件
?spec文件關(guān)鍵字說明大全
rpmbuild的目錄和Spec宏變量和參數(shù)說明
preamble部分
Body 部分
標(biāo)題宏變量/工作目錄
符號說明
spec文件不寫依賴的情況依然存在依賴庫
CMake制作rpm包
HelloWorld
rpm debuginfo包的作用
更多SPEC例子
報(bào)錯(cuò)記錄
前言
打rpm 包需要的東西有 源碼、spec文件(打rpm包的腳本)、rpmbuild工具。
官網(wǎng)教程:RPM Packaging Guide--https://rpm-packaging-guide.github.io/#rpm
推薦文章:
RPM打包原理、示例、詳解及備查:https://blog.csdn.net/get_set/article/details/53453320
安裝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 文件夾下。我門的源碼可能是一個(gè)tar.gz 的包、也可能是幾個(gè)文件。
tar.gz源碼包的名字格式應(yīng)該為 helloword-1.0.0.tar.gz (其實(shí)就是名字-版本號.tar.gz)
2,編寫spec文件
在SPECS文件夾下新建 xxx.spec 打包腳本,其實(shí)也就是把我門的源碼編譯打包成rpm 的一個(gè)過程。
(有個(gè)rpmdev-newspec工具可以自動生成一個(gè).spec 模板)
vi xxx.spec
Name: hellorpm #名字為源碼tar.gz 包的名字
Version: 1.0.0 #版本號,一定要與tar.gz包的一致哦
Release: 1%{?dist} #釋出號,也就是第幾次制作rpm
Summary: helloword #描述信息/軟件包簡介,最好不超過50字符
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License: GPL #許可,GPL還是BSD等
URL: #自定義該信息,可以寫一個(gè)網(wǎng)址
Packager: abel
Source0: %{name}-%{version}.tar.gz
#定義用到的source,也就是你的源碼
BuildRoot: %_topdir/BUILDROOT
#這個(gè)是軟件make install 的測試安裝目錄.
BuildRequires: gcc,make #制作過程中用到的軟件包
Requires: python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7 #軟件運(yùn)行依賴的軟件包,也可以指定最低版本如 bash >= 1.1.1
%description #描述,隨便寫
%prep #打包開始
%setup -q #這個(gè)作用靜默模式解壓并cd
%build #編譯制作階段,主要目的就是編譯,如果不用編譯就為空
./configure \
%{?_smp_mflags} #make后面的意思是:如果就多處理器的話make時(shí)并行編譯
%install #安裝階段//安裝之前需初始化安裝目錄
rm -rf %{buildroot} #先刪除原來的安裝的,如果你不是第一次安裝的話
cp -rp %_topdir/BUILD/%{name}-%{version}/* $RPM_BUILD_ROOT
#將需要需要打包的文件從BUILD 文件夾中拷貝到BUILDROOT文件夾下。
#下面的幾步pre、post、preun、postun 沒必要可以不寫
%pre #rpm安裝前制行的腳本
%post #安裝后執(zhí)行的腳本//安裝之后需要執(zhí)行的動作
cp /usr/local/httpd/bin/apachectl /etc/init.d/myhttpd
sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/myhttpd
%preun #卸載前執(zhí)行的腳本//卸載該rpm包所執(zhí)行的一些操作
/etc/init.d/myhttpd stop
%postun #卸載后執(zhí)行的腳本
%clean #清理段,刪除buildroot
rm -rf %{buildroot}
%files #rpm要包含的文件//安裝之后生成的文件
%defattr (-,root,root,-) #設(shè)定默認(rèn)權(quán)限,如果下面沒有指定權(quán)限,則繼承默認(rèn)
/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 <zsp@tarena.com> 2.2.25
- first rpm from httpd-2.2.25
(這spec里面的%build ,%install 容易寫錯(cuò)而報(bào)錯(cuò),所以我們可以不配置 %build ,%install,不讓rpmbuild代我們執(zhí)行build 和install ,我們在外面make install,然后rpmbuild 打包結(jié)果)
注意:
以上階段如果沒有操作的話,為空,但是不能有空行,例如build階段為空應(yīng)寫為
?
%build
%install
xxxxxxxx
錯(cuò)誤示例:
%build
%install
xxxxxxxx
rpm包制作階段
3, build rpm包
?spec 文件編寫好以后就可以進(jìn)行打包了。
在SPECS文件夾下執(zhí)行命令:
rpmbuild -ba hello.spec
如果出錯(cuò)了可以通過 不同的命令來看是在打包的那一步出了問題。
rpmbuild -ba spec_name.spec <--編譯,既生成源碼src.rpm又生成二進(jìn)制rpm?
rpmbuild -bb spec_name.spec <--編譯,只生二進(jìn)制的rpm?
rpmbuild ?
-bs 只生成src的rpm?
-bp 執(zhí)行到pre?
-bc 執(zhí)行到 build段?
-bi 執(zhí)行install段?
-bl 檢測有文件沒包含?
可以先rpmbuild -bp ,再-bc 再-bi 如果沒問題,rpmbuild -ba 生成src包與二進(jìn)制包。
?
4, 安裝
rpmbuild -ivh hello.rpm
5, 查詢
rpm -qi hello
rpm -qa|grep hello
本文參考:
http://laoguang.blog.51cto.com/6013350/1103628/
http://blog.chinaunix.net/uid-23069658-id-3944462.html
原文鏈接:https://blog.csdn.net/u012373815/article/details/73257754
另外的打包教程:https://blog.csdn.net/weixin_33875564/article/details/92785284
?
同時(shí)生成devel包
devel是以子包的形式出現(xiàn)的,所以只需在spec文件里面增加%files devel配置段即可
Name: kmymoney
Summary: The Personal Finances Manager for KDE.
Version: 0.8
Release: 1.%{disttag}%{distver}
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License: GPL
Packager: %packer
Group: Productivity/Office/Finance
Source0: %{name}2-%version.tar.bz2
BuildRoot: %{_tmppath}/%{name}2-%{version}-%{release}-build
BuildRequires: kdebase3-devel
Prereq: /sbin/ldconfig
%description
Description goes here...
%package devel
#Requires:
Summary: KMyMoney development files
Group: Productivity/Office/Finance
Provides: kmymoney-devel
%description devel
This package contains necessary header files for KMyMoney development.
... more to go here ...
%files
... some files ...
%files devel
... the devel files ...
示例:
http://kmymoney2.sourceforge.net/phb/rpm-example.html
參考: https://stackoverflow.com/questions/2913130/building-both-devel-and-normal-version-of-a-rpm-package
(摘自:https://phpor.net/blog/post/5673)
阻止rpmbuid打包時(shí)strip程序/庫
默認(rèn)情況下,在使用rpmbuild打包時(shí),會對安裝的所有文件進(jìn)行strip操作,去除文件的一些調(diào)試信息,并將這些調(diào)試信息放到
中,但在很多時(shí)候,我們并不需要rpmbuild幫我們執(zhí)行strip,也不需要生成debuginfo包,所以我們可以修改一下spec文件,關(guān)閉這些選項(xiàng)。
針對文件的strip操作是在__os_install_post這個(gè)宏中定義的,我們可以運(yùn)行一下rpmbuild --showrc看一下原始的__os_install_post做了哪些操作:
-
...
-14: __os_install_
?/usr/lib/rpm/redhat/brp-compress
?%{!?__debug_package:/usr/lib/rpm/redhat/brp-strip:q %{__strip}} - ?/usr/lib/rpm/redhat/brp-strip-static-archive %{__strip}
- ?/usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump}
- ?/usr/lib/rpm/brp-python-bytecompile
- ?/usr/lib/rpm/redhat/brp-python-hardlink
- ?%{!?__jar_repack:/usr/lib/rpm/redhat/brp-java-repack-jars}
- ...
可以看到在打包時(shí)會對文件進(jìn)行一系列操作,比如壓縮,strip,編譯Python腳本等。
要想不strip,就要把上面帶strip的語句去掉,或者讓它門失效。
方法1:
在spec文件前面加,直接不做__os_install_post 里的任何事情
%global?__os_install_post %{nil}
方法2:
在前面加
%define debug_package %{nil}
%define __strip /bin/true
把__strip 變量定義為/bin/true (原來是/usr/bin/strip),相當(dāng)于啥也沒干。
摘自:https://www.cnblogs.com/LiuYanYGZ/p/9565861.html
$ rpm --showrc | grep -A 4 ': __os_install_post'
-14: __os_install_post??
??? /usr/lib/rpm/brp-compress?
??? /usr/lib/rpm/brp-strip?
??? /usr/lib/rpm/brp-strip-static-archive?
??? /usr/lib/rpm/brp-strip-comment-noteRecently, I had an uncommon requirement to disable this option. I do not want to reduce the file size of all files packaged in the rpm. This is achievable using any of 3 mechanisms.
- Spec file
- ~/.rpmmacros
- /etc/rpm/macros
To prevent binary stripping for specific rpm, we could add following line at the top of any rpm spec file.
%global?__os_install_post %{nil}
To prevent binary stripping for all rpms created by specific user, we could add following line in?~/.rpmmacros?file:
%__os_install_post %{nil}To prevent binary stripping for all rpms created by all users, we could add following line in?/etc/rpm/macros?file:
?%__os_install_post %{nil}
修改rpm、重新制作rpm包
提取spec文件
rpmrebuild -s helloworld.spec helloworld.x86_64.rpm
解壓原rpm包,得到helloworld
rpm2cpio helloworld.rpm|cpio -div
修改or替換helloworld里面的內(nèi)容
創(chuàng)建文件夾/tmp/rpmbuild
mkdir /tmp/buildrpm
把helloworld和helloworld.spec 都放入其中<----------------------這一步很關(guān)鍵
cp -r helloworld helloworld.spec /tmp/buildrpm
重新編出rpm包
rpmbuild -ba --buildroot /tmp/buildrpm/ /tmp/buildrpm/helloworld.spec
?
RPM 打包 工具
rpmdevtools包提供的打包RPM的工具。要列出這些工具,請運(yùn)行:
$ rpm -ql rpmdevtools | grep bin
標(biāo)題創(chuàng)建打包工作目錄
執(zhí)行
rpmdev-setuptree
$ tree ~/rpmbuild/
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
目錄名 說明 macros中的宏名
BUILD 編譯rpm包的臨時(shí)目錄 %_builddir
BUILDROOT 編譯后生成的軟件臨時(shí)安裝目錄 %_buildrootdir
RPMS 最終生成的可安裝rpm包的所在目錄 %_rpmdir
SOURCES 所有源代碼和補(bǔ)丁文件的存放目錄 %_sourcedir
SPECS 存放SPEC文件的目錄(重要) %_specdir
SRPMS 軟件最終的rpm源碼格式存放路徑(暫時(shí)忽略掉,別掛在心上) %_srcrpmdir
SPEC文件
Spec文件用于告訴rpmbuild如何構(gòu)建RPM或者SRPM包。(RPM,SRPM區(qū)別參見:http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm)
Spec文件包含preamble和body兩部分,preamble部分主要包含一些包的元數(shù)據(jù),body部分主要用于打包,安裝等
?spec文件關(guān)鍵字說明大全
主要關(guān)鍵字有:
Name: 軟件包的名稱,后面可使用%{name}的方式引用
Summary: 軟件包的內(nèi)容概要
Version: 軟件的實(shí)際版本號,例如:1.0.1等,后面可使用%{version}引用
Release: 發(fā)布序列號,例如:1%{?dist},標(biāo)明第幾次打包,后面可使用%{release}引用
Group: 軟件分組,建議使用:Applications/System
License: 軟件授權(quán)方式,通常就是GPL
Source: 源代碼包,可以帶多個(gè)用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 這個(gè)是安裝或編譯時(shí)使用的“虛擬目錄”,考慮到多用戶的環(huán)境,一般定義為:
%{_tmppath}/%{name}-%{version}-%{release}-root
或
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
該參數(shù)非常重要,因?yàn)樵谏蓃pm的過程中,執(zhí)行make install時(shí)就會把軟件安裝到上述的路徑中,在打包的時(shí)候,同樣依賴“虛擬目錄”為“根目錄”進(jìn)行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟件的主頁
Vendor: 發(fā)行商或打包組織的信息,打包組織或者人員,例如RedFlag Co,Ltd
Disstribution: 發(fā)行版標(biāo)識
Patch: 補(bǔ)丁源碼,可使用Patch1、Patch2等標(biāo)識多個(gè)補(bǔ)丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個(gè)主要是為了解決今后安裝rpm包時(shí),并不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這里定義該標(biāo)識,并在編寫%install腳本的時(shí)候引用,才能實(shí)現(xiàn)rpm安裝時(shí)重新指定位置的功能
Prefix: %{_sysconfdir} 這個(gè)原因和上面的一樣,但由于%{_prefix}指/usr,而對于其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標(biāo)識
Build Arch: 指編譯的目標(biāo)處理器架構(gòu),noarch標(biāo)識不指定,但通常都是以/usr/lib/rpm/marcros中的內(nèi)容為默認(rèn)值
Requires: 該rpm包所依賴的軟件包名稱,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib?注意:“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開。
還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對不同階段的依賴指定?(spec沒有寫的依賴也依賴進(jìn)來了?見后面的章節(jié)說明)
Provides: 指明本軟件一些特定的功能,以便其他rpm識別
Packager: 打包者的信息
%description 軟件的詳細(xì)說明%define: 預(yù)定義的變量,例如定義日志路徑: _logpath /var/log/weblog
spec腳本主體?
spec腳本的主體中也包括了很多關(guān)鍵字和描述,下面會一一列舉。我會把一些特別需要留意的地方標(biāo)注出來。
%prep?? ? ? 預(yù)處理腳本,這個(gè)段是預(yù)處理段,通常用來執(zhí)行一些解開源程序包的命令,為下一步的編譯安裝作準(zhǔn)備。%prep和下面的%build,%install段一樣,除了可以執(zhí)行RPM所定義的宏命令(以%開頭)以外,還可以執(zhí)行SHELL命令,命令可以有很多行,如我們常寫的tar解包命令。
%setup
把源碼包解壓并放好
通常是從/usr/src/asianux/SOURCES里的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。%setup -q %{name}-%{version}
一般用%setup -q就可以了,但有兩種情況:一就是同時(shí)編譯多個(gè)源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時(shí),就需要使用-n參數(shù)指定一下了。%setup 不加任何選項(xiàng),僅將軟件包打開。
%setup -q 在安靜模式下且最少輸出
%setup -D #在解壓之前禁止刪除目錄
%setup -a number #在改變目錄后,僅解壓給定數(shù)字的源碼,如-a 0 for source0
%setup -n newdir 將軟件包解壓到newdir目錄。
%setup -c 解壓縮之前先產(chǎn)生目錄。
%setup -b num 包含多個(gè)源文件時(shí),將第num個(gè)source文件解壓縮。
%setup -T 不使用default的解壓縮操作。
%setup -T -b 0 將第0個(gè)源代碼文件SOURCE0解壓縮。
%setup -c -n newdir 指定目錄名稱newdir,并在此目錄產(chǎn)生rpm套件。
%patch 打補(bǔ)丁
通常補(bǔ)丁都會一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數(shù)為:
%patch -p1 使用前面定義的Patch補(bǔ)丁進(jìn)行,-p1是忽略patch的第一層目錄
%Patch2 -p1 -b xxx.patch 打上指定的補(bǔ)丁,-b是指生成備份文件
◎補(bǔ)充一下?
%patch 最簡單的補(bǔ)丁方式,自動指定patch level。?
%patch 0 使用第0個(gè)補(bǔ)丁文件,相當(dāng)于%patch ?p 0。?
%patch -s 不顯示打補(bǔ)丁時(shí)的信息。?
%patch -T 將所有打補(bǔ)丁時(shí)產(chǎn)生的輸出文件刪除。%patch #打補(bǔ)?。?/p>
%patch1 #打補(bǔ)?。?/p>
%patch2 #打補(bǔ)丁2
%patch -P 2 #打補(bǔ)?。?/p>
在%build之前,%prep部分將準(zhǔn)備好編譯工作,解開源碼包,并將相應(yīng)的補(bǔ)丁打進(jìn)去。
%configure 這個(gè)不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令。意思是執(zhí)行源代碼的configure配置
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行 ,使用標(biāo)準(zhǔn)寫法,會引用/usr/lib/rpm/marcros中定義的參數(shù)。
另一種不標(biāo)準(zhǔn)的寫法是,可參考源碼中的參數(shù)自定義,例如:引用
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
%build 開始構(gòu)建包
開始編譯源碼構(gòu)建包,相當(dāng)于configure以及make部分
所要執(zhí)行的命令為生成軟件包服務(wù),如
%configure 這個(gè)不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令。意思是執(zhí)行源代碼的configure配置,可以用rpm –eval '%configure'命令查看該宏
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行操作 ,使用標(biāo)準(zhǔn)寫法,會引用/usr/lib/rpm/marcros中定義的參數(shù)。
另一種不標(biāo)準(zhǔn)的寫法是,可參考源碼中的參數(shù)自定義,例如:CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
make 命令
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行make的工作 ,常見寫法:make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些優(yōu)化參數(shù),定義在/usr/lib/rpm/marcros中
%install 開始把軟件安裝到虛擬的根目錄中本段是安裝段,其中的命令在安裝軟件包時(shí)將執(zhí)行,如make install命令、cp、mv、install、ln。
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進(jìn)行make install的操作。這個(gè)很重要,因?yàn)槿绻@里的路徑不對的話,則下面%file中尋找文件的時(shí)候就會失敗。 常見內(nèi)容有:
%makeinstall 這不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令,相當(dāng)于執(zhí)行make install命令那一步。也可以使用非標(biāo)準(zhǔn)寫法:
make DESTDIR=$RPM_BUILD_ROOT install
make prefix=$RPM_BUILD_ROOT install
make INSTROOT=$RPM_BUILD_ROOT install
需要說明的是,這里的%install主要就是為了后面的%file服務(wù)的。所以,還可以使用常規(guī)的系統(tǒng)命令:rm -rf ${RPM_BUILD_ROOT}
mkdir -p $RPM_BUILD_ROOT/{%{_bindir},%{_mandir}/man1,%{_libdir},%{_includedir}}
install -m 755 bzlib.h $RPM_BUILD_ROOT/%{_includedir}
install -m 644 bzip2.1 bzdiff.1 bzgrep.1 bzmore.1??$RPM_BUILD_ROOT/%{_mandir}/man1/
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/ln -s file/magic??${RPM_BUILD_ROOT}%{_datadir}/magic
%find_lang??%{name}
%files -f??%{name}.lang
第一句生成一個(gè)名為%{name}.lang的文件,內(nèi)容是所有的%{name}.mo,第二句意思是一個(gè)一個(gè)列舉.mo文件很麻煩,-f參數(shù)是將其后邊接的文件合并到%files的文件列表。
%clean 清理臨時(shí)文件
通常內(nèi)容為:[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
※注意區(qū)分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。?
%pre rpm安裝前執(zhí)行的腳本
%post rpm安裝后執(zhí)行的腳本
%preun rpm卸載前執(zhí)行的腳本
%postun rpm卸載后執(zhí)行的腳本%preun?%postun 的區(qū)別是什么呢?
前者在升級的時(shí)候會執(zhí)行,后者在升級rpm包的時(shí)候不會執(zhí)行
%files 定義要打包哪些文件或目錄到rpm中
這里會在虛擬根目錄下進(jìn)行,千萬不要寫絕對路徑,而應(yīng)用宏或變量表示相對路徑。 如果描述為目錄,表示目錄中除%exclude外的所有文件。
%defattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認(rèn)值,對文本文件是0644,可執(zhí)行文件是0755
%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也會出錯(cuò)的。?
%changelog 變更日志
※特別需要注意的是:%install部分使用的是絕對路徑,而%file部分使用則是相對路徑,雖然其描述的是同一個(gè)地方。千萬不要寫錯(cuò)。%file?
就是%file中必須明白,用的是相對目錄 引用分為三類-說明文檔(doc),配置文件(config)及執(zhí)行程序,還可定義文件存取權(quán)限,擁有者及組別
ile1 #文件中也可以包含通配符,如*
file2
directory #所有文件都放在directory目錄下
%dir /etc/xtoolwait #僅是一個(gè)空目錄/etc/xtoolwait打進(jìn)包里
%doc??表示這是文檔文件,因此如安裝時(shí)使用--excludedocs將不安裝該文件,
%doc /usr/X11R6/man/man1/xtoolwait.* #安裝該文檔
%doc README NEWS #安裝這些文檔到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者
%docdir #定義說明文檔的目錄,例如/root,在這一語句后,所有以/root開頭的行都被定義為說明文件。
%config /etc/yp.conf #標(biāo)志該文件是一個(gè)配置文件,升級過程中,RPM會有如下動作。
%config(missisgok) /etc/yp.conf 此配置文件可以丟失,即使丟失了,RPM在卸載軟件包時(shí)也不認(rèn)為這是一個(gè)錯(cuò)誤,并不報(bào)錯(cuò)。一般用于那些軟件包安裝后建立的符號鏈接文件,如
/etc/rc.d/rc5.d/S55named文件,此類文件在軟件包卸載后可能需要?jiǎng)h除,所以丟失了也不要緊。
%config(noreplace) /etc/yp.conf
#該配置文件不會覆蓋已存在文件(RPM包中文件會以.rpmnew存在于系統(tǒng),卸載時(shí)系統(tǒng)中的該配置文件會以.rpmsave保存下來,如果沒有這個(gè)選項(xiàng),安裝時(shí)RPM包中文件會以.rpmorig存在于系統(tǒng) )
覆蓋已存在文件(沒被修改),創(chuàng)建新的文件加上擴(kuò)展后綴.rpmnew(被修改)
%{_bindir}/*
%config??/etc/aa.conf
%ghost /etc/yp.conf #該文件不應(yīng)該包含在包中,一般是日志文件,其文件屬性很重要,但是文件內(nèi)容不重要,用了這個(gè)選項(xiàng)后,僅將其文件屬性加入包中。
%attr(mode, user, group) filename #控制文件的權(quán)限如%attr(0644,root,root) /etc/yp.conf
如果你不想指定值,可以用-
%config %attr(-,root,root) filename #設(shè)定文件類型和權(quán)限
%defattr (-,root,root,-)? ?、%defattr (0644,root,root,0644) ??#設(shè)置文件的默認(rèn)權(quán)限,-表示默認(rèn)值,對文本文件是0644,可執(zhí)行文件是0755
%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh* #用特定的語言標(biāo)志文件
%verify(owner group size) filename #只測試owner,group,size,默認(rèn)測試所有
%verify(not owner) filename #不測試owner,測試其他的屬性
所有的認(rèn)證如下:
group:??認(rèn)證文件的組
maj:????認(rèn)證文件的主設(shè)備號
md5:????認(rèn)證文件的MD5
min:????認(rèn)證文件的輔設(shè)備號
mode:???認(rèn)證文件的權(quán)限
mtime:??認(rèn)證文件最后修改時(shí)間
owner:??認(rèn)證文件的所有者
size:???認(rèn)證文件的大小
symlink:認(rèn)證符號連接
如果描述為目錄,表示目錄中出%exclude外的所有文件。
%files?
%defattr(-,root,root)?
%{_bindir}?
%{_libdir}?
%{_datadir}?
%exclude %{_libdir}/debug由于必須在%file中包括所有套件中的文件,所以,我們需要清楚編譯完的套件到底包括那些文件,常見的做法是,人工模擬一次編譯的過程:
./configrue --prefix=/usr/local/xxx
make
make DESTDIR=/usr/local/xxx install
或
make prefix=/usr/local/xxx install
這樣,整個(gè)套件的內(nèi)容就會被放到/usr/local/xxx中,可根據(jù)情況編寫%file和%exclude段
※當(dāng)然,這個(gè)只能對源碼按GNU方式編寫,并使用GNU autotool創(chuàng)建的包有效,若自定義Makefile則不能一概而論。
%pre: 安裝前需要做的任務(wù),如:創(chuàng)建用戶
%post: 安裝后需要做的任務(wù) 如:自動啟動的任務(wù)
%preun: 卸載前需要做的任務(wù) 如:停止任務(wù)
%postun: 卸載后需要做的任務(wù) 如:刪除用戶,刪除/備份業(yè)務(wù)數(shù)據(jù)%changelog
變更日志,本段是修改日志段。你可以將軟件的每次修改記錄到這里,保存到發(fā)布的軟件包中,以便查詢之用。每一個(gè)修改日志都有這樣一種格式:
第一行是:* 星期月日 年 修改人電子信箱。
其中:星期、月份均用英文形式的前3個(gè)字母,用中文會報(bào)錯(cuò)。接下來的行寫的是修改了什么地方,可寫多行。一般以減號開始,便于后續(xù)的查 閱。
* Mon Mar 31 1997 Erik Troan <ewt@redhat.com>
- Fixed problems caused by 64 bit time_t.
制作補(bǔ)丁?
詳細(xì)看參考:?[原]使用diff同patch工具?
如何編寫%file段?
由于必須在%file中包括所有套件中的文件,所以,我們需要清楚編譯完的套件到底包括那些文件?
常見的做法是,人工模擬一次編譯的過程:?這樣,整個(gè)套件的內(nèi)容就會被放到/usr/local/xxx中,可根據(jù)情況編寫%file和%exclude段。※當(dāng)然,這個(gè)只能對源碼按GNU方式編寫,并使用GNU autotool創(chuàng)建的包有效,若自定義Makefile則不能一概而論。?
關(guān)于rpm中的執(zhí)行腳本?
如果正在制作的rpm包是準(zhǔn)備作為放到系統(tǒng)安裝光盤中的話,則需要考慮rpm中定義的腳本是否有問題。由于系統(tǒng)在安裝的時(shí)候只是依賴于一個(gè)小環(huán)境進(jìn)行,而該環(huán)境與實(shí)際安裝完的環(huán)境有很大的區(qū)別,所以,大部分的腳本在該安裝環(huán)境中都是無法生效,甚至?xí)砺闊┑摹?br> 所以,對于這樣的,需要放到安裝光盤中的套件,不加入執(zhí)行腳本是較佳的方法。
另外,為提供操作中可參考的信息,rpm還提供了一種信號機(jī)制:不同的操作會返回不同的信息,并放到默認(rèn)變量$1中。更多:rpm打包,rpmbuild SPEC文件深度說明_https://blog.csdn.net/u013425438/article/details/80417542
詳細(xì)介紹在:https://www.cnblogs.com/ilanni/p/4312581.html
https://blog.51cto.com/luweiv998/2354385
https://blog.csdn.net/csdn_763871244/article/details/99937600
rpmbuild的目錄和Spec宏變量和參數(shù)說明
preamble部分
SPEC 指令 |
說明 |
|
The base name of the package, which should match the SPEC file name. 包的基本名稱,應(yīng)與SPEC文件名匹配。 |
|
軟件的上游版本號。 |
|
The number of times this version of the software was released. Normally, set the initial value to 1%{?dist}, and increment it with each new release of the package. Reset to 1 when a new? 此版本軟件的發(fā)布次數(shù)。通常,將初始值設(shè)置為1%{?dist},并該版本的每次新發(fā)布遞增。生成新版本的軟件時(shí),重置為1。 |
|
一個(gè)簡短的、單行的包摘要。 |
|
The license of the software being packaged. For packages distributed in community distributions such as?Fedora?this must be an open source license abiding by the specific distribution’s licensing guidelines. ? |
|
The full URL for more information about the program. Most often this is the upstream project website for the software being packaged. 有關(guān)該程序的詳細(xì)信息的完整URL。通常,這是打包軟件的上游項(xiàng)目網(wǎng)站。 |
|
Path or URL to the compressed archive of the upstream source code (unpatched, patches are handled elsewhere). This should point to an accessible and reliable storage of the archive, for example, the upstream page and not the packager’s local storage. If needed, more SourceX directives can be added, incrementing the number each time, for example: Source1, Source2, Source3, and so on. 上游源代碼壓縮包的路徑或URL(未修補(bǔ),補(bǔ)丁在其他地方處理)。這應(yīng)該指向可訪問且可靠的包路徑,例如,上游頁面,而不是打包程序的本地存儲。如果需要,可以添加更多的SourceX地址,每次遞增數(shù)字,例如:Source1、Source2、Source3等。 |
|
The name of the first patch to apply to the source code if necessary. If needed, more PatchX directives can be added, incrementing the number each time, for example: Patch1, Patch2, Patch3, and so on. 必要時(shí)應(yīng)用于源代碼的第一個(gè)補(bǔ)丁的名稱。如果需要,可以添加更多的PatchX,每次遞增數(shù)字,例如:Patch1、Patch2、Patch3等。 |
|
If the package is not architecture dependent, for example, if written entirely in an interpreted programming language, set this to? 如果包不依賴于平臺架構(gòu),例如和硬件平臺無關(guān)的腳本,請將其設(shè)置為BuildArch:noarch。如果未設(shè)置,軟件包將自動設(shè)置為 機(jī)器的平臺結(jié)構(gòu),例如x86_64。 |
|
A comma- or whitespace-separated list of packages required for building the program written in a compiled language. There can be multiple entries of? 編譯程序用到的文件的列表,用逗號或空格分隔。在SPEC文件中,可以有多個(gè)BuildRequires條目,,每個(gè)條目單獨(dú)一行 |
|
A comma- or whitespace-separated list of packages required by the software to run once installed. There can be multiple entries of? 軟件安裝后運(yùn)行所依賴的rpm的文件列表,用逗號或空格分隔。在SPEC文件中,可以有多個(gè)Requires條目,每個(gè)條目單獨(dú)一行 (spec沒有寫的依賴也依賴進(jìn)來了?見后面的章節(jié)說明) |
|
If a piece of software can not operate on a specific processor architecture, you can exclude that architecture here. 如果某個(gè)軟件不能在特定的處理器架構(gòu)上運(yùn)行,則可以在此處排除該架構(gòu)。 |
例如:要生成的包名是?python-2.7.5-34.el7.x86_64,則
Name:
python,
Version:
2.7.5,Release:34.el7
最后一個(gè)標(biāo)記是x86_64,表示體系結(jié)構(gòu)。體系結(jié)構(gòu)標(biāo)記不受RPM打包器的直接控制,而是由rpmbuild構(gòu)建環(huán)境定義。唯一的例外是要構(gòu)建的RPM與硬件平臺無關(guān)時(shí),自己可以填寫
BuildArch:
noarch.
Body 部分
SPEC 指令 |
說明 |
|
A full description of the software packaged in the RPM. This description can span multiple lines and can be broken into paragraphs. RPM中軟件包的完整描述。此描述可以跨越多行,并可以拆分為段落。 |
|
Command or series of commands to prepare the software to be built, for example, unpacking the archive in? 構(gòu)建之前的處理,例如,創(chuàng)建or刪除目錄,解壓從Source0獲取到的壓縮包……可以包含shell腳本。 |
|
Command or series of commands for actually building the software into machine code (for compiled languages) or byte code (for some interpreted languages). 編譯生成程序的的命令或一系列命令。 |
|
Command or series of commands for copying the desired build artifacts from the? ? |
|
Command or series of commands to test the software. This normally includes things such as unit tests. 測試軟件的命令或一系列命令。這通常包括單元測試等內(nèi)容。 |
|
The list of files that will be installed in the end user’s system. 將安裝在最終用戶系統(tǒng)中的文件列表。(也就是需要打包進(jìn)rpm包的文件列表--絕對路徑) |
|
A record of changes that have happened to the package between different? 不同版本或發(fā)行版本之間對包所做更改的記錄。 |
標(biāo)題宏變量/工作目錄
默認(rèn)工作路徑的確定,通常由在/usr/lib/rpm/macros這個(gè)文件里的一個(gè)叫做%_topdir的宏變量來定義。
在%_topdir目錄下一般需要建立6個(gè)目錄:
$_topdir /root/rpmbuild
目錄名 說明 macros中的宏名
BUILD 編譯rpm包的臨時(shí)目錄 %_builddir
BUILDROOT 編譯后生成的軟件臨時(shí)安裝目錄 %_buildrootdir
RPMS 最終生成的可安裝rpm包的所在目錄 %_rpmdir
SOURCES 所有源代碼和補(bǔ)丁文件的存放目錄 %_sourcedir
SPECS 存放SPEC文件的目錄(重要) %_specdir
SRPMS 軟件最終的rpm源碼格式存放路徑(暫時(shí)忽略掉,別掛在心上) %_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/rpmbuildrpmbuild --showrc顯示所有的宏,以下劃線開頭:
一個(gè)下劃線:定義環(huán)境的使用情況,
二個(gè)下劃線:通常定義的是命令,
為什么要定義宏,因?yàn)椴煌南到y(tǒng),命令的存放位置可能不同,所以通過宏的定義找到命令的真正存放位置
符號說明
什么是 1%{?dist} : 如果%{dist}未定義返回1,否則返回1%{dist},
if 0%{?flag}; then
foo
fi
如果%{flag}被定義了,條件語句為:0%{flag},執(zhí)行if block; 反之,條件語句為:0, 不執(zhí)行if block。
注意:%{?flag}前必須加0,否則如果%{?flag}未定義,if語句停止執(zhí)行并退出。
%{?flag: …}:如果%{flag}被定義,則展開"…"部分
作者:weiee
鏈接:https://www.jianshu.com/p/f1e36e4a152c
?
Note:
rpm --eval %{kernel_module_package_buildreqs}->kernel-devel
rpm --eval %{kernel_module_package} 會輸出一些關(guān)于制作linux驅(qū)動的一些代碼和一些依賴
重要的是包含了%files 路徑,%files包含了需要打包進(jìn)入rpm包里的文件,如果是 / 開頭那么其實(shí)是BUILDROOT路徑
制作的時(shí)候%install 是安裝到~/rpmbuild/BUILDROOT的,最后發(fā)布rpm后運(yùn)行yum install rpm會
把驅(qū)動安裝到lib/modules/( u n a m e ? r ) / u p d a t e s B u i l d R o o t : 在 e x p o r t I N S T A L L M O D P A T H = (uname -r)/updates BuildRoot: 在 %install 階段(%build 階段后)文件需要安裝至此位置。Fedora 不需要此標(biāo)簽,只有 EPEL5 還需要它。默認(rèn)情況下,根目錄為 “%{_topdir}/BUILDROOT/”。 %_buildrootdir 最終安裝目錄 ~/rpmbuild/BUILDROOT 保存 %install 階段安裝的文件 export INSTALL_MOD_PATH=(uname?r)/updatesBuildRoot:在exportINSTALL?
MOD?PATH=RPM_BUILD_ROOT export INSTALL_MOD_DIR=updates 這兩句話說明了安裝的時(shí)候的路徑,是~/rpmbuild/BUILDROOT ,最后里面會生成對應(yīng)的lib/modules/$(uname -r)/updates 下面
如果%clean 不加會默認(rèn)把BUILDROOT給刪掉
原文鏈接:https://blog.csdn.net/Wang20122013/article/details/122498396
spec文件不寫依賴的情況依然存在依賴庫
由于很多東西需要保密,所以不放截圖rpm -qlp *.rpm
查看rpm包中攜帶的文件ldd file
檢測編譯文件夾下的bin文件是否是bin文件帶來的依賴vi /usr/lib/rpm/micro
編輯rpm的編譯宏
找到455,456行,注釋掉
455 #%__find_provides %{_rpmconfigdir}/find-provides
456 #%__find_requires %{_rpmconfigdir}/find-requires
重新編譯,使用rpm -qpR *.rpm
檢測新生成的rpm是否帶有依賴
如果問題未被解決,則在spec文件Requires下面加入一行AutoReqprv: no
來規(guī)避掉二進(jìn)制文件帶來的依賴?AUTOREQ=0? (注意使用AutoReqprv:no 之后需要手工寫spc 該rpm包的provider
鏈接:https://www.jianshu.com/p/3eff04b20f93
The AUTOREQPROV, AUTOREQ, and AUTOPROV tags are not available for use with --queryformat.
Available Tags For --queryformat---http://ftp.rpm.org/max-rpm/ch-queryformat-tags.html
rpm包是怎么自動搞進(jìn)一些依賴項(xiàng)的:
答案是rpmbuild使用ldd命令對%files部分中包含的任何二進(jìn)制文件生成自動依賴關(guān)系:
Automatic Dependencies
?
CMake制作rpm包
(摘自:https://blog.csdn.net/qq_29493353/article/details/90205415)
也可以使用cmake 制作rpm包,CMake中包含的三個(gè)工具(cmake cpack ctest)中的cpack工具。他可以幫助快速的打包發(fā)布你的程序。
HelloWorld
目錄結(jié)構(gòu)
CMakeList.txt
cmake_minimum_required(VERSION 2.8)
# 設(shè)置項(xiàng)目名稱
project(HelloWorld)
# 設(shè)置安裝路徑, 默認(rèn)/usr/local。也可以是idc經(jīng)常安裝的/data/home/user00/xxxserver等
# set(CPACK_PACKAGING_INSTALL_PREFIX /opt)
# 如果不是CMake構(gòu)建的,設(shè)置CMAKE_CURRENT_BINARY_DIR為Makefile的構(gòu)建目錄
set(CMAKE_CURRENT_BINARY_DIR ..)
# 批量的安裝指令,目錄、程序、庫文件、頭文件等
install(PROGRAMS bin/hello DESTINATION bin)
install(FILES bin/hello.a DESTINATION lib)
install(FILES src/hello.h DESTINATION include)
# 以下為RPM信息的設(shè)置,包名,概述,供應(yīng)者,版本, 分組等等信息,通過其變量名稱可以知道意思
set(CPACK_PACKAGE_NAME "wetest-helloworld")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simple CPack HelloWorld")
set(CPACK_PACKAGE_VENDOR "WeTest")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_RPM_PACKAGE_GROUP "WeTest")
set(CPACK_RPM_PACKAGE_URL "http://wetest.qq.com")
set(CPACK_RPM_PACKAGE_DESCRIPTION "WeTest Server Dependencies")
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_RPM_PACKAGE_LICENSE "WeTest Licence")
# 設(shè)置默認(rèn)生成器,RPM生成器會構(gòu)建RPM安裝包,其它還有TGZ/ZIP等
set(CPACK_GENERATOR "RPM")
# 安裝前和安裝后執(zhí)行的shell腳本, 會打包到RPM中,安裝時(shí)執(zhí)行。這里可擴(kuò)展性很強(qiáng), 放在源碼目錄下即可
# set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/pre_script.sh)
# set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/post_script.sh)
# 引入CPack模塊,必須的
include(CPack)
構(gòu)建
mkdir build && cd build
$ cmake …
$ make install
$ cpack
其中capck支持其他的打包格式,比如tar.gz和zip,只需要執(zhí)行cpack -G TGZ 或者 cpack -G ZIP就可打包成相應(yīng)的格式。
結(jié)論
以上主要是用cpack打包開發(fā)程序,其實(shí)可以針對很多東西制作rpm包,比如很多依賴已經(jīng)用源碼安裝好的開發(fā)壞境,也可以打包,公司tlinux的提供了兼容性。比如mysql++已經(jīng)裝在系統(tǒng)/usr/local/當(dāng)中,替換模板中的描述和install指令如下即可:
file(GLOB mysqlppso /usr/local/lib/libmysqlpp*)
install(DIRECTORY /usr/local/include/mysql++ DESTINATION include)
install(PROGRAMS ${mysqlppso} DESTINATION lib)
希望能夠幫助大家快速部署,也推薦使用CMake來完成構(gòu)建任務(wù),如果有用的話之后介紹下ctest + boost unit test做單元測試。
?
rpm debuginfo包的作用
一般在linux上,編寫一個(gè)軟件后,都會用rpmbuild工具打包成rpm包,然后發(fā)給別人去部署。
rpm包里一般就是有一些可執(zhí)行文件,靜態(tài)庫或者動態(tài)庫,但是不包含源代碼。
那么有時(shí)候?yàn)榱苏{(diào)試方便,還會同時(shí)生成相應(yīng)的rpm debuginfo包,這樣就可以方便調(diào)試。只要客戶安裝了普通rpm包和相應(yīng)版本的debuginfo包,就可以gdb調(diào)試了
更多詳細(xì)請看原文《rpm debuginfo包的作用》:https://blog.csdn.net/chenj_freedom/article/details/84023885
更多SPEC例子
#前期準(zhǔn)備: ? ? ? yum -y install rpmdevtools pcre-devel ??
#-------------------------------------------------------
# 查看默認(rèn)宏: ? rpmbuild --showrc ?| ?grep ?"_topdir"
# ?_builddir ? ? ?%{_topdir}/BUILD
# ?_buildrootdir %{_topdir}/BUILDROOT
# ?_rpmdir ? ? ? %{_topdir}/RPMS
# ?_sourcedir ? ?%{_topdir}/SOURCES ? ?---> ?原材料,如源碼包,文檔所在目錄,需事先將打包的源文件或腳本存放在此目錄內(nèi)......
# ?_specdir ? ? ?%{_topdir}/SPECS ? ---> ?管理rpm制作過程的描述文件所在的目錄
# ?_srcrpmdir ? ?%{_topdir}/SRPMS
# ?_topdir ? ? ? ?%{getenv:HOME}/rpmbuild ? ---> ?rpmbuild目錄的頂層入口
#-------------------------------------------------------
#生成~/rpmbuild及子目錄: ? ?rpmdev-setuptree
#生成rpmbuild的spec模板: ? ?rpmdev-newspec -o Name-version.spec ?---> ? 生成的SPEC文件主要用于描述RPM包的制作和生成過程
#eg:
#[root@localhost ~]# ?rpmdev-setuptree && cd rpmbuild ; tree
#.
#├── BUILD
#├── RPMS
#├── SOURCES
#├── SPECS
#└── SRPMS
#------------------------------------------------------------------------------------------------------------------------- 以下是spec文件內(nèi)容:
?
#自定義宏,相當(dāng)于Linux中"Key-Value"變量形式
%define Name nginx ?#---> ?名稱
%define Version 1.2.2 ?#---> ?版本
%define CONFIGFILE 1.conf ? #---> ? 本rpm包中需更換的配置文件......
%define InstallPath /usr/local/nginx ?#---> ? 本rpm包默認(rèn)安裝的路徑
?
#定義軟件包信息,即:"rpm -qi name.rpm " 查看到的內(nèi)容
Name: ? ? ? ? ? %{Name} ? #---> ? 引用宏
Version: ? ? ? ?%{Version} ? #---> ? 引用宏
Release: ? ? ? ?1%{?dist} ? #---> ? 引用宏(自帶宏)
Summary: ? ? ? ?....................................... #---> ?一些描述信息
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License: ? ? ? ?GPLv2 ?#---> ?授權(quán)協(xié)議
URL: ? ? ? ? ? ?inmoonlight@.163.com
buildroot: ? ? ?%{_topdir}/BUILDROOT ? #---> ?指定生產(chǎn)車間(非常重要,因在生成rpm過程中執(zhí)行make install時(shí)會把軟件安裝到此路徑,打包時(shí)同樣依此目錄為“根目錄”進(jìn)行操作)
Source0: ? ? ? ?%{Name}-%{Version}.tar.gz ? #---> 指定源碼編譯的文件,默認(rèn)路徑:%{_topdir}/SOURCES ?
SOURCE1: ? ? ? ?%{CONFIGFILE} ?#---> 指定要替換的配置文件,默認(rèn)路徑:%{_topdir}/SOURCES ?
BuildRequires: ? ? ?gcc,make,automake,binutils ?#---> ?軟件依賴信息
Requires: ? ? ?bash >= 2.0 #---> ?定義軟件依賴信息,該rpm包所依賴的軟件包名稱,可用>=或<=表示大或小于特定版本
%description
This is %{Name} .....Just a test rpm suite.............
?
#安裝前的準(zhǔn)備工作,此處可寫入執(zhí)行腳本
%pre
useradd %{Name} -s /sbin/nologin
?
#安裝前的準(zhǔn)備:此段默認(rèn)將Source目錄內(nèi)的源碼包在BUILD目錄解壓為%{Name}-%{Version}格式的目錄
%prep
%setup -q -n %{Name}-%{Version} ?#---> 參數(shù):-c 解壓縮之前先產(chǎn)生目錄,-n newdir 將軟件包解壓在newdir目錄
?
#定義config動作
%build
./configure --prefix=%{InstallPath} --user=%{Name} --group=%{Name}?
make %{?_smp_mflags}
?
#定義執(zhí)行make install時(shí)的動作
%install
rm -rf %{buildroot} #---> 刪除生產(chǎn)車間內(nèi)的殘留文件
%{__make} install DESTDIR=%{buildroot} #---> 將軟件安裝至指定的目錄
%{__install} -p -D -m 0755 ?%{SOURCE1} %{buildroot}/usr/local/nginx/conf/%{CONFIGFILE} #---> ?替換指定的配置文件
?
#賦予文件的默認(rèn)權(quán)限及設(shè)置需在RPM包中保留的文件
%files
%doc
%defattr(-,root,root,-) ?#---> 指定包裝文件屬性,分別是(mode,owner,group),- 表示默認(rèn)值,文本文件是0644,可執(zhí)行文件0755
%attr(0755,root,root) /usr/local/nginx/sbin/nginx ?#---> ?針對單一文件設(shè)置權(quán)限
%{_prefix}/*
%{_prefix}/local/nginx/conf/%{CONFIGFILE}
?
#制作完成后的清理工作
%clean
rm -rf %{buildroot}
?
#安裝后的執(zhí)行工作,此處可寫入執(zhí)行腳本
%post
chkconfig --add nginx
chkconfig --level 345 nginx on
?
#變更日志
%changelog
?
#---------------------------------------------------------------------------------------------
# ? ?2.1 介紹區(qū)域的SOURCE0下增加如下
# ? ?Source0: ? ? ? ?%{name}-%{version}.tar.gz?
# ? ?Source1: ? ? ? ?index.html?
# ? ?Source2: ? ? ? ?init.nginx?
# ? ?Source3: ? ? ? ?fastcgi_params?
# ? ?Source4: ? ? ? ?nginx.conf?
?
# ? ?2.2 安裝區(qū)域增加如下
# ? ?make install DESTDIR=%{buildroot}?
# ? ?%{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html ?#%{__install}這個(gè)宏代表install命令
# ? ?%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx?
# ? ?%{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params?
# ? ?%{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf?
?
?
將腳本制作成為RPM包的例子:
?
Name: eee
Version: 1
Release: 1%{?dist}
Summary:1111
?
License:GPLv2
URL: ? ?inmoonlighy.11.cn
Source0: eee
?
%description
.....
?
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/bin/
cp -rf ?%{SOURCE0} %{buildroot}/bin
?
%files
/bin/eee
?
%changelog
?
#注:安裝時(shí)失敗應(yīng)加“rpm -ivh --force ***.rpm 進(jìn)行嘗試”
#---------------------------------------------------------------------------------------------
#rpmbuild:
# ? ?-bl ? ? ? ? ?檢查spec中的%file段來查看文件是否齊全
# ? ?-ba ? ? ? ? 建立二進(jìn)制包&源碼
# ? ?-bb ? ? ? ? 建立二進(jìn)制包
# ? ?-bp ? ? ? ?執(zhí)行到 prep 階段
# ? ?-bc ? ? ? ? 執(zhí)行到 build 階段
# ? ?-bi ? ? ? ? 執(zhí)行到 install 階段
#?
#制作: ? ?cd /usr/src/redhat/SPECS/ ; rpmbuild -ba nginx.spec ? --> 生成:/usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
#測試: ? ?rpm -ivh /usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
?
《使用cpack打包源碼并編寫自動化腳本上傳到倉庫》
https://blog.csdn.net/weixin_34319640/article/details/87972767
報(bào)錯(cuò)記錄
make: *** No rule to make target `install’
(摘自:https://www.cnblogs.com/chenyaling/p/5806965.html)
遇到最大的坑就是%install部分的make install
網(wǎng)上的資料是這樣說的:
本段是安裝段,其中的命令在安裝軟件包時(shí)將執(zhí)行,如make install命令。
%makeinstall 這不是關(guān)鍵字,而是rpm定義的標(biāo)準(zhǔn)宏命令。也可以使用非標(biāo)準(zhǔn)寫法:引用make DESTDIR=R P M B U I L D R O O T i n s t a l l 或引用 m a k e p r e f i x = RPM_BUILD_ROOT install或引用make prefix=RPM?BUILD?ROOTinstall或引用makeprefix=RPM_BUILD_ROOT install
需要說明的是,這里的%install主要就是為了后面的%file服務(wù)的。所以,還可以使用常規(guī)的系統(tǒng)命令:
引用install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
但是我每次使用make install時(shí)候都會報(bào)錯(cuò)make: *** No rule to make target ‘install’。換成install -d的寫好就可以,我也不明白是為什么。后來發(fā)現(xiàn),使用make install是在已經(jīng)編寫過Makefile的前提下進(jìn)行的,報(bào)錯(cuò)中的install其實(shí)是Makefile中的寫好的target。
舉個(gè)例子,在Makefile中編寫,如下:
install-oem:
mkdir -p $(LIBDIR)/xsconsole/plugins-oem
則在%install中就可以這樣寫:%install
make install-oem DESTDIR=$RPM_BUILD_ROOT
否則,當(dāng)然會報(bào)錯(cuò)找不到target。朱老師說現(xiàn)在使用Makefile已經(jīng)有點(diǎn)過時(shí)了。我是覺得Makefile很煩,寫錯(cuò)了,還要重新打包,生成壓縮文件才行。改多了之后根本受不了,不如直接在%install里面直接寫內(nèi)容,這樣改起來也方便。
?
安裝 rpm包出現(xiàn)error: unpacking of archive failed on file文章來源:http://www.zghlxwxcb.cn/news/detail-439448.html
https://blog.csdn.net/qq_36911595/article/details/112668637文章來源地址http://www.zghlxwxcb.cn/news/detail-439448.html
到了這里,關(guān)于【rpm】源碼包制作rpm包|修改rpm、重新制作rpm包 rpm debuginfo包的作用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!