目錄
前言
安裝rpmbuild
rpmbuild制作rpm 包
同時生成devel包
阻止rpmbuid打包時strip程序/庫
修改rpm、重新制作rpm包
RPM 打包 工具
SPEC文件
?spec文件關鍵字說明大全
rpmbuild的目錄和Spec宏變量和參數說明
preamble部分
Body 部分
標題宏變量/工作目錄
符號說明
spec文件不寫依賴的情況依然存在依賴庫
CMake制作rpm包
HelloWorld
rpm debuginfo包的作用
更多SPEC例子
報錯記錄
前言
打rpm 包需要的東西有 源碼、spec文件(打rpm包的腳本)、rpmbuild工具。
官網教程: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 文件夾下。我門的源碼可能是一個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字符
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
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 #安裝后執(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,-) #設定默認權限,如果下面沒有指定權限,則繼承默認
/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 容易寫錯而報錯,所以我們可以不配置 %build ,%install,不讓rpmbuild代我們執(zhí)行build 和install ,我們在外面make install,然后rpmbuild 打包結果)
注意:
以上階段如果沒有操作的話,為空,但是不能有空行,例如build階段為空應寫為
?
%build
%install
xxxxxxxx
錯誤示例:
%build
%install
xxxxxxxx
rpm包制作階段
3, build rpm包
?spec 文件編寫好以后就可以進行打包了。
在SPECS文件夾下執(zhí)行命令:
rpmbuild -ba hello.spec
如果出錯了可以通過 不同的命令來看是在打包的那一步出了問題。
rpmbuild -ba spec_name.spec <--編譯,既生成源碼src.rpm又生成二進制rpm?
rpmbuild -bb spec_name.spec <--編譯,只生二進制的rpm?
rpmbuild ?
-bs 只生成src的rpm?
-bp 執(zhí)行到pre?
-bc 執(zhí)行到 build段?
-bi 執(zhí)行install段?
-bl 檢測有文件沒包含?
可以先rpmbuild -bp ,再-bc 再-bi 如果沒問題,rpmbuild -ba 生成src包與二進制包。
?
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
?
同時生成devel包
devel是以子包的形式出現的,所以只需在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打包時strip程序/庫
默認情況下,在使用rpmbuild打包時,會對安裝的所有文件進行strip操作,去除文件的一些調試信息,并將這些調試信息放到
中,但在很多時候,我們并不需要rpmbuild幫我們執(zhí)行strip,也不需要生成debuginfo包,所以我們可以修改一下spec文件,關閉這些選項。
針對文件的strip操作是在__os_install_post這個宏中定義的,我們可以運行一下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}
- ...
可以看到在打包時會對文件進行一系列操作,比如壓縮,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),相當于啥也沒干。
摘自: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里面的內容
創(chuàng)建文件夾/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
?
RPM 打包 工具
rpmdevtools包提供的打包RPM的工具。要列出這些工具,請運行:
$ rpm -ql rpmdevtools | grep bin
標題創(chuàng)建打包工作目錄
執(zhí)行
rpmdev-setuptree
$ tree ~/rpmbuild/
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
目錄名 說明 macros中的宏名
BUILD 編譯rpm包的臨時目錄 %_builddir
BUILDROOT 編譯后生成的軟件臨時安裝目錄 %_buildrootdir
RPMS 最終生成的可安裝rpm包的所在目錄 %_rpmdir
SOURCES 所有源代碼和補丁文件的存放目錄 %_sourcedir
SPECS 存放SPEC文件的目錄(重要) %_specdir
SRPMS 軟件最終的rpm源碼格式存放路徑(暫時忽略掉,別掛在心上) %_srcrpmdir
SPEC文件
Spec文件用于告訴rpmbuild如何構建RPM或者SRPM包。(RPM,SRPM區(qū)別參見:http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm)
Spec文件包含preamble和body兩部分,preamble部分主要包含一些包的元數據,body部分主要用于打包,安裝等
?spec文件關鍵字說明大全
主要關鍵字有:
Name: 軟件包的名稱,后面可使用%{name}的方式引用
Summary: 軟件包的內容概要
Version: 軟件的實際版本號,例如:1.0.1等,后面可使用%{version}引用
Release: 發(fā)布序列號,例如:1%{?dist},標明第幾次打包,后面可使用%{release}引用
Group: 軟件分組,建議使用:Applications/System
License: 軟件授權方式,通常就是GPL
Source: 源代碼包,可以帶多個用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 這個是安裝或編譯時使用的“虛擬目錄”,考慮到多用戶的環(huán)境,一般定義為:
%{_tmppath}/%{name}-%{version}-%{release}-root
或
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
該參數非常重要,因為在生成rpm的過程中,執(zhí)行make install時就會把軟件安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”為“根目錄”進行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟件的主頁
Vendor: 發(fā)行商或打包組織的信息,打包組織或者人員,例如RedFlag Co,Ltd
Disstribution: 發(fā)行版標識
Patch: 補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個主要是為了解決今后安裝rpm包時,并不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這里定義該標識,并在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能
Prefix: %{_sysconfdir} 這個原因和上面的一樣,但由于%{_prefix}指/usr,而對于其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識
Build Arch: 指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容為默認值
Requires: 該rpm包所依賴的軟件包名稱,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib?注意:“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開。
還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對不同階段的依賴指定?(spec沒有寫的依賴也依賴進來了?見后面的章節(jié)說明)
Provides: 指明本軟件一些特定的功能,以便其他rpm識別
Packager: 打包者的信息
%description 軟件的詳細說明%define: 預定義的變量,例如定義日志路徑: _logpath /var/log/weblog
spec腳本主體?
spec腳本的主體中也包括了很多關鍵字和描述,下面會一一列舉。我會把一些特別需要留意的地方標注出來。
%prep?? ? ? 預處理腳本,這個段是預處理段,通常用來執(zhí)行一些解開源程序包的命令,為下一步的編譯安裝作準備。%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就可以了,但有兩種情況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n參數指定一下了。%setup 不加任何選項,僅將軟件包打開。
%setup -q 在安靜模式下且最少輸出
%setup -D #在解壓之前禁止刪除目錄
%setup -a number #在改變目錄后,僅解壓給定數字的源碼,如-a 0 for source0
%setup -n newdir 將軟件包解壓到newdir目錄。
%setup -c 解壓縮之前先產生目錄。
%setup -b num 包含多個源文件時,將第num個source文件解壓縮。
%setup -T 不使用default的解壓縮操作。
%setup -T -b 0 將第0個源代碼文件SOURCE0解壓縮。
%setup -c -n newdir 指定目錄名稱newdir,并在此目錄產生rpm套件。
%patch 打補丁
通常補丁都會一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數為:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目錄
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份文件
◎補充一下?
%patch 最簡單的補丁方式,自動指定patch level。?
%patch 0 使用第0個補丁文件,相當于%patch ?p 0。?
%patch -s 不顯示打補丁時的信息。?
%patch -T 將所有打補丁時產生的輸出文件刪除。%patch #打補?。?/p>
%patch1 #打補?。?/p>
%patch2 #打補丁2
%patch -P 2 #打補?。?/p>
在%build之前,%prep部分將準備好編譯工作,解開源碼包,并將相應的補丁打進去。
%configure 這個不是關鍵字,而是rpm定義的標準宏命令。意思是執(zhí)行源代碼的configure配置
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行 ,使用標準寫法,會引用/usr/lib/rpm/marcros中定義的參數。
另一種不標準的寫法是,可參考源碼中的參數自定義,例如:引用
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
%build 開始構建包
開始編譯源碼構建包,相當于configure以及make部分
所要執(zhí)行的命令為生成軟件包服務,如
%configure 這個不是關鍵字,而是rpm定義的標準宏命令。意思是執(zhí)行源代碼的configure配置,可以用rpm –eval '%configure'命令查看該宏
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行操作 ,使用標準寫法,會引用/usr/lib/rpm/marcros中定義的參數。
另一種不標準的寫法是,可參考源碼中的參數自定義,例如:CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
make 命令
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make的工作 ,常見寫法:make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些優(yōu)化參數,定義在/usr/lib/rpm/marcros中
%install 開始把軟件安裝到虛擬的根目錄中本段是安裝段,其中的命令在安裝軟件包時將執(zhí)行,如make install命令、cp、mv、install、ln。
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make install的操作。這個很重要,因為如果這里的路徑不對的話,則下面%file中尋找文件的時候就會失敗。 常見內容有:
%makeinstall 這不是關鍵字,而是rpm定義的標準宏命令,相當于執(zhí)行make install命令那一步。也可以使用非標準寫法:
make DESTDIR=$RPM_BUILD_ROOT install
make prefix=$RPM_BUILD_ROOT install
make INSTROOT=$RPM_BUILD_ROOT install
需要說明的是,這里的%install主要就是為了后面的%file服務的。所以,還可以使用常規(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
第一句生成一個名為%{name}.lang的文件,內容是所有的%{name}.mo,第二句意思是一個一個列舉.mo文件很麻煩,-f參數是將其后邊接的文件合并到%files的文件列表。
%clean 清理臨時文件
通常內容為:[ "$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ū)別是什么呢?
前者在升級的時候會執(zhí)行,后者在升級rpm包的時候不會執(zhí)行
%files 定義要打包哪些文件或目錄到rpm中
這里會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。 如果描述為目錄,表示目錄中除%exclude外的所有文件。
%defattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執(zhí)行文件是0755
%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也會出錯的。?
%changelog 變更日志
※特別需要注意的是:%install部分使用的是絕對路徑,而%file部分使用則是相對路徑,雖然其描述的是同一個地方。千萬不要寫錯。%file?
就是%file中必須明白,用的是相對目錄 引用分為三類-說明文檔(doc),配置文件(config)及執(zhí)行程序,還可定義文件存取權限,擁有者及組別
ile1 #文件中也可以包含通配符,如*
file2
directory #所有文件都放在directory目錄下
%dir /etc/xtoolwait #僅是一個空目錄/etc/xtoolwait打進包里
%doc??表示這是文檔文件,因此如安裝時使用--excludedocs將不安裝該文件,
%doc /usr/X11R6/man/man1/xtoolwait.* #安裝該文檔
%doc README NEWS #安裝這些文檔到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者
%docdir #定義說明文檔的目錄,例如/root,在這一語句后,所有以/root開頭的行都被定義為說明文件。
%config /etc/yp.conf #標志該文件是一個配置文件,升級過程中,RPM會有如下動作。
%config(missisgok) /etc/yp.conf 此配置文件可以丟失,即使丟失了,RPM在卸載軟件包時也不認為這是一個錯誤,并不報錯。一般用于那些軟件包安裝后建立的符號鏈接文件,如
/etc/rc.d/rc5.d/S55named文件,此類文件在軟件包卸載后可能需要刪除,所以丟失了也不要緊。
%config(noreplace) /etc/yp.conf
#該配置文件不會覆蓋已存在文件(RPM包中文件會以.rpmnew存在于系統(tǒng),卸載時系統(tǒng)中的該配置文件會以.rpmsave保存下來,如果沒有這個選項,安裝時RPM包中文件會以.rpmorig存在于系統(tǒng) )
覆蓋已存在文件(沒被修改),創(chuàng)建新的文件加上擴展后綴.rpmnew(被修改)
%{_bindir}/*
%config??/etc/aa.conf
%ghost /etc/yp.conf #該文件不應該包含在包中,一般是日志文件,其文件屬性很重要,但是文件內容不重要,用了這個選項后,僅將其文件屬性加入包中。
%attr(mode, user, group) filename #控制文件的權限如%attr(0644,root,root) /etc/yp.conf
如果你不想指定值,可以用-
%config %attr(-,root,root) filename #設定文件類型和權限
%defattr (-,root,root,-)? ?、%defattr (0644,root,root,0644) ??#設置文件的默認權限,-表示默認值,對文本文件是0644,可執(zhí)行文件是0755
%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh* #用特定的語言標志文件
%verify(owner group size) filename #只測試owner,group,size,默認測試所有
%verify(not owner) filename #不測試owner,測試其他的屬性
所有的認證如下:
group:??認證文件的組
maj:????認證文件的主設備號
md5:????認證文件的MD5
min:????認證文件的輔設備號
mode:???認證文件的權限
mtime:??認證文件最后修改時間
owner:??認證文件的所有者
size:???認證文件的大小
symlink:認證符號連接
如果描述為目錄,表示目錄中出%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
這樣,整個套件的內容就會被放到/usr/local/xxx中,可根據情況編寫%file和%exclude段
※當然,這個只能對源碼按GNU方式編寫,并使用GNU autotool創(chuàng)建的包有效,若自定義Makefile則不能一概而論。
%pre: 安裝前需要做的任務,如:創(chuàng)建用戶
%post: 安裝后需要做的任務 如:自動啟動的任務
%preun: 卸載前需要做的任務 如:停止任務
%postun: 卸載后需要做的任務 如:刪除用戶,刪除/備份業(yè)務數據%changelog
變更日志,本段是修改日志段。你可以將軟件的每次修改記錄到這里,保存到發(fā)布的軟件包中,以便查詢之用。每一個修改日志都有這樣一種格式:
第一行是:* 星期月日 年 修改人電子信箱。
其中:星期、月份均用英文形式的前3個字母,用中文會報錯。接下來的行寫的是修改了什么地方,可寫多行。一般以減號開始,便于后續(xù)的查 閱。
* Mon Mar 31 1997 Erik Troan <ewt@redhat.com>
- Fixed problems caused by 64 bit time_t.
制作補丁?
詳細看參考:?[原]使用diff同patch工具?
如何編寫%file段?
由于必須在%file中包括所有套件中的文件,所以,我們需要清楚編譯完的套件到底包括那些文件?
常見的做法是,人工模擬一次編譯的過程:?這樣,整個套件的內容就會被放到/usr/local/xxx中,可根據情況編寫%file和%exclude段。※當然,這個只能對源碼按GNU方式編寫,并使用GNU autotool創(chuàng)建的包有效,若自定義Makefile則不能一概而論。?
關于rpm中的執(zhí)行腳本?
如果正在制作的rpm包是準備作為放到系統(tǒng)安裝光盤中的話,則需要考慮rpm中定義的腳本是否有問題。由于系統(tǒng)在安裝的時候只是依賴于一個小環(huán)境進行,而該環(huán)境與實際安裝完的環(huán)境有很大的區(qū)別,所以,大部分的腳本在該安裝環(huán)境中都是無法生效,甚至會帶來麻煩的。
所以,對于這樣的,需要放到安裝光盤中的套件,不加入執(zhí)行腳本是較佳的方法。
另外,為提供操作中可參考的信息,rpm還提供了一種信號機制:不同的操作會返回不同的信息,并放到默認變量$1中。更多:rpm打包,rpmbuild SPEC文件深度說明_https://blog.csdn.net/u013425438/article/details/80417542
詳細介紹在: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宏變量和參數說明
preamble部分
SPEC 指令 |
說明 |
|
The base name of the package, which should match the SPEC file name. 包的基本名稱,應與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ā)布次數。通常,將初始值設置為1%{?dist},并該版本的每次新發(fā)布遞增。生成新版本的軟件時,重置為1。 |
|
一個簡短的、單行的包摘要。 |
|
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. 有關該程序的詳細信息的完整URL。通常,這是打包軟件的上游項目網站。 |
|
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(未修補,補丁在其他地方處理)。這應該指向可訪問且可靠的包路徑,例如,上游頁面,而不是打包程序的本地存儲。如果需要,可以添加更多的SourceX地址,每次遞增數字,例如: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. 必要時應用于源代碼的第一個補丁的名稱。如果需要,可以添加更多的PatchX,每次遞增數字,例如:Patch1、Patch2、Patch3等。 |
|
If the package is not architecture dependent, for example, if written entirely in an interpreted programming language, set this to? 如果包不依賴于平臺架構,例如和硬件平臺無關的腳本,請將其設置為BuildArch:noarch。如果未設置,軟件包將自動設置為 機器的平臺結構,例如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文件中,可以有多個BuildRequires條目,,每個條目單獨一行 |
|
A comma- or whitespace-separated list of packages required by the software to run once installed. There can be multiple entries of? 軟件安裝后運行所依賴的rpm的文件列表,用逗號或空格分隔。在SPEC文件中,可以有多個Requires條目,每個條目單獨一行 (spec沒有寫的依賴也依賴進來了?見后面的章節(jié)說明) |
|
If a piece of software can not operate on a specific processor architecture, you can exclude that architecture here. 如果某個軟件不能在特定的處理器架構上運行,則可以在此處排除該架構。 |
例如:要生成的包名是?python-2.7.5-34.el7.x86_64,則
Name:
python,
Version:
2.7.5,Release:34.el7
最后一個標記是x86_64,表示體系結構。體系結構標記不受RPM打包器的直接控制,而是由rpmbuild構建環(huán)境定義。唯一的例外是要構建的RPM與硬件平臺無關時,自己可以填寫
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? 構建之前的處理,例如,創(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. 測試軟件的命令或一系列命令。這通常包括單元測試等內容。 |
|
The list of files that will be installed in the end user’s system. 將安裝在最終用戶系統(tǒng)中的文件列表。(也就是需要打包進rpm包的文件列表--絕對路徑) |
|
A record of changes that have happened to the package between different? 不同版本或發(fā)行版本之間對包所做更改的記錄。 |
標題宏變量/工作目錄
默認工作路徑的確定,通常由在/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/rpmbuildrpmbuild --showrc顯示所有的宏,以下劃線開頭:
一個下劃線:定義環(huán)境的使用情況,
二個下劃線:通常定義的是命令,
為什么要定義宏,因為不同的系統(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} 會輸出一些關于制作linux驅動的一些代碼和一些依賴
重要的是包含了%files 路徑,%files包含了需要打包進入rpm包里的文件,如果是 / 開頭那么其實是BUILDROOT路徑
制作的時候%install 是安裝到~/rpmbuild/BUILDROOT的,最后發(fā)布rpm后運行yum install rpm會
把驅動安裝到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 不需要此標簽,只有 EPEL5 還需要它。默認情況下,根目錄為 “%{_topdir}/BUILDROOT/”。 %_buildrootdir 最終安裝目錄 ~/rpmbuild/BUILDROOT 保存 %install 階段安裝的文件 export INSTALL_MOD_PATH=(uname?r)/updatesBuildRoot:在exportINSTALL?
MOD?PATH=RPM_BUILD_ROOT export INSTALL_MOD_DIR=updates 這兩句話說明了安裝的時候的路徑,是~/rpmbuild/BUILDROOT ,最后里面會生成對應的lib/modules/$(uname -r)/updates 下面
如果%clean 不加會默認把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ī)避掉二進制文件帶來的依賴?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包是怎么自動搞進一些依賴項的:
答案是rpmbuild使用ldd命令對%files部分中包含的任何二進制文件生成自動依賴關系:
Automatic Dependencies
?
CMake制作rpm包
(摘自:https://blog.csdn.net/qq_29493353/article/details/90205415)
也可以使用cmake 制作rpm包,CMake中包含的三個工具(cmake cpack ctest)中的cpack工具。他可以幫助快速的打包發(fā)布你的程序。
HelloWorld
目錄結構
CMakeList.txt
cmake_minimum_required(VERSION 2.8)
# 設置項目名稱
project(HelloWorld)
# 設置安裝路徑, 默認/usr/local。也可以是idc經常安裝的/data/home/user00/xxxserver等
# set(CPACK_PACKAGING_INSTALL_PREFIX /opt)
# 如果不是CMake構建的,設置CMAKE_CURRENT_BINARY_DIR為Makefile的構建目錄
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信息的設置,包名,概述,供應者,版本, 分組等等信息,通過其變量名稱可以知道意思
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")
# 設置默認生成器,RPM生成器會構建RPM安裝包,其它還有TGZ/ZIP等
set(CPACK_GENERATOR "RPM")
# 安裝前和安裝后執(zhí)行的shell腳本, 會打包到RPM中,安裝時執(zhí)行。這里可擴展性很強, 放在源碼目錄下即可
# 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)
構建
mkdir build && cd build
$ cmake …
$ make install
$ cpack
其中capck支持其他的打包格式,比如tar.gz和zip,只需要執(zhí)行cpack -G TGZ 或者 cpack -G ZIP就可打包成相應的格式。
結論
以上主要是用cpack打包開發(fā)程序,其實可以針對很多東西制作rpm包,比如很多依賴已經用源碼安裝好的開發(fā)壞境,也可以打包,公司tlinux的提供了兼容性。比如mysql++已經裝在系統(tǒng)/usr/local/當中,替換模板中的描述和install指令如下即可:
file(GLOB mysqlppso /usr/local/lib/libmysqlpp*)
install(DIRECTORY /usr/local/include/mysql++ DESTINATION include)
install(PROGRAMS ${mysqlppso} DESTINATION lib)
希望能夠幫助大家快速部署,也推薦使用CMake來完成構建任務,如果有用的話之后介紹下ctest + boost unit test做單元測試。
?
rpm debuginfo包的作用
一般在linux上,編寫一個軟件后,都會用rpmbuild工具打包成rpm包,然后發(fā)給別人去部署。
rpm包里一般就是有一些可執(zhí)行文件,靜態(tài)庫或者動態(tài)庫,但是不包含源代碼。
那么有時候為了調試方便,還會同時生成相應的rpm debuginfo包,這樣就可以方便調試。只要客戶安裝了普通rpm包和相應版本的debuginfo包,就可以gdb調試了
更多詳細請看原文《rpm debuginfo包的作用》:https://blog.csdn.net/chenj_freedom/article/details/84023885
更多SPEC例子
#前期準備: ? ? ? yum -y install rpmdevtools pcre-devel ??
#-------------------------------------------------------
# 查看默認宏: ? rpmbuild --showrc ?| ?grep ?"_topdir"
# ?_builddir ? ? ?%{_topdir}/BUILD
# ?_buildrootdir %{_topdir}/BUILDROOT
# ?_rpmdir ? ? ? %{_topdir}/RPMS
# ?_sourcedir ? ?%{_topdir}/SOURCES ? ?---> ?原材料,如源碼包,文檔所在目錄,需事先將打包的源文件或腳本存放在此目錄內......
# ?_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文件內容:
?
#自定義宏,相當于Linux中"Key-Value"變量形式
%define Name nginx ?#---> ?名稱
%define Version 1.2.2 ?#---> ?版本
%define CONFIGFILE 1.conf ? #---> ? 本rpm包中需更換的配置文件......
%define InstallPath /usr/local/nginx ?#---> ? 本rpm包默認安裝的路徑
?
#定義軟件包信息,即:"rpm -qi name.rpm " 查看到的內容
Name: ? ? ? ? ? %{Name} ? #---> ? 引用宏
Version: ? ? ? ?%{Version} ? #---> ? 引用宏
Release: ? ? ? ?1%{?dist} ? #---> ? 引用宏(自帶宏)
Summary: ? ? ? ?....................................... #---> ?一些描述信息
#生成rpm包名:${Name}-${Version}-${Release}.${BuildArch}.rpm
License: ? ? ? ?GPLv2 ?#---> ?授權協(xié)議
URL: ? ? ? ? ? ?inmoonlight@.163.com
buildroot: ? ? ?%{_topdir}/BUILDROOT ? #---> ?指定生產車間(非常重要,因在生成rpm過程中執(zhí)行make install時會把軟件安裝到此路徑,打包時同樣依此目錄為“根目錄”進行操作)
Source0: ? ? ? ?%{Name}-%{Version}.tar.gz ? #---> 指定源碼編譯的文件,默認路徑:%{_topdir}/SOURCES ?
SOURCE1: ? ? ? ?%{CONFIGFILE} ?#---> 指定要替換的配置文件,默認路徑:%{_topdir}/SOURCES ?
BuildRequires: ? ? ?gcc,make,automake,binutils ?#---> ?軟件依賴信息
Requires: ? ? ?bash >= 2.0 #---> ?定義軟件依賴信息,該rpm包所依賴的軟件包名稱,可用>=或<=表示大或小于特定版本
%description
This is %{Name} .....Just a test rpm suite.............
?
#安裝前的準備工作,此處可寫入執(zhí)行腳本
%pre
useradd %{Name} -s /sbin/nologin
?
#安裝前的準備:此段默認將Source目錄內的源碼包在BUILD目錄解壓為%{Name}-%{Version}格式的目錄
%prep
%setup -q -n %{Name}-%{Version} ?#---> 參數:-c 解壓縮之前先產生目錄,-n newdir 將軟件包解壓在newdir目錄
?
#定義config動作
%build
./configure --prefix=%{InstallPath} --user=%{Name} --group=%{Name}?
make %{?_smp_mflags}
?
#定義執(zhí)行make install時的動作
%install
rm -rf %{buildroot} #---> 刪除生產車間內的殘留文件
%{__make} install DESTDIR=%{buildroot} #---> 將軟件安裝至指定的目錄
%{__install} -p -D -m 0755 ?%{SOURCE1} %{buildroot}/usr/local/nginx/conf/%{CONFIGFILE} #---> ?替換指定的配置文件
?
#賦予文件的默認權限及設置需在RPM包中保留的文件
%files
%doc
%defattr(-,root,root,-) ?#---> 指定包裝文件屬性,分別是(mode,owner,group),- 表示默認值,文本文件是0644,可執(zhí)行文件0755
%attr(0755,root,root) /usr/local/nginx/sbin/nginx ?#---> ?針對單一文件設置權限
%{_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}這個宏代表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
?
#注:安裝時失敗應加“rpm -ivh --force ***.rpm 進行嘗試”
#---------------------------------------------------------------------------------------------
#rpmbuild:
# ? ?-bl ? ? ? ? ?檢查spec中的%file段來查看文件是否齊全
# ? ?-ba ? ? ? ? 建立二進制包&源碼
# ? ?-bb ? ? ? ? 建立二進制包
# ? ?-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
報錯記錄
make: *** No rule to make target `install’
(摘自:https://www.cnblogs.com/chenyaling/p/5806965.html)
遇到最大的坑就是%install部分的make install
網上的資料是這樣說的:
本段是安裝段,其中的命令在安裝軟件包時將執(zhí)行,如make install命令。
%makeinstall 這不是關鍵字,而是rpm定義的標準宏命令。也可以使用非標準寫法:引用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服務的。所以,還可以使用常規(guī)的系統(tǒng)命令:
引用install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
但是我每次使用make install時候都會報錯make: *** No rule to make target ‘install’。換成install -d的寫好就可以,我也不明白是為什么。后來發(fā)現,使用make install是在已經編寫過Makefile的前提下進行的,報錯中的install其實是Makefile中的寫好的target。
舉個例子,在Makefile中編寫,如下:
install-oem:
mkdir -p $(LIBDIR)/xsconsole/plugins-oem
則在%install中就可以這樣寫:%install
make install-oem DESTDIR=$RPM_BUILD_ROOT
否則,當然會報錯找不到target。朱老師說現在使用Makefile已經有點過時了。我是覺得Makefile很煩,寫錯了,還要重新打包,生成壓縮文件才行。改多了之后根本受不了,不如直接在%install里面直接寫內容,這樣改起來也方便。
?
安裝 rpm包出現error: unpacking of archive failed on file文章來源:http://www.zghlxwxcb.cn/news/detail-439449.html
https://blog.csdn.net/qq_36911595/article/details/112668637文章來源地址http://www.zghlxwxcb.cn/news/detail-439449.html
到了這里,關于【rpm】源碼包制作rpm包|修改rpm、重新制作rpm包 rpm debuginfo包的作用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!