一 基础知识
(1)spec描述信息
① 常用的
'以nginx-1.18.0.tar.gz为案例'
###########分割线
Name: 软件包的名称,后面可使用'%{name}'的方式引用
Summary: 软件包的内容概要-->英文的话第一个'字母应大写',以避免 rpmlint 工具('打包检查工具')警告
Version: 软件的'实际版本号',例如:1.18.0等,后面可使用'%{version}'引用
Release: 发布序列号,例如:1,表明'第几次打包',后面可使用'%{release}'引用
Group: 软件分组,建议使用'标准分组'
"less /usr/share/doc/rpm-*/GROUPS" 查看完整的'组列表'
Amusements/Games ('娱乐/游戏')
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases ('应用/数据库')
Applications/Editors ('应用/编辑器')
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet ('应用/因特网')
Applications/Multimedia('应用/多媒体')
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System ('开发/系统')
Development/Tools ('开发/工具')
Documentation (文档)
System Environment/Base('系统环境/基础')
System Environment/Daemons ('系统环境/守护')
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells ('系统环境/接口')
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support ('用户界面/X硬件支持')
License: 软件'授权方式',通常就是'GPL' -->'自由软件'
URL: 该软件包的'项目主页',或者说'从哪下载的源码',只是描述,不具备实际的意思,相当于'主页'
eg: http://nginx.org/download
'Source': 源代码包
备注:'只有一个'源码的时候,可以'使用Source',不过'为了统一',统一以'Source+数字编号'
后面也可以用'%{source1}、%{source2}引用'
'举例'
SOurce0 %{url}/%{name}-%{version}.tar.gz
如何保留时间戳
Requires:
'该rpm包安装'所依赖的'软件包名称',可以'用>=或<='表示大于或小于某一'特定版本'
例如:libpng-devel >= 1.0.20 zlib
备注: ">="号两边需用'空格隔开',而不同软件名称也用'空格'分开
BuildRequires: 针对'编译阶段'的依赖指定 -->'gcc、make'
'了解': 还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
Packager: '打包者的信息'
很重要: '劳动成果'
Packager: wzj <11125246519@qq.com>
Patch: 补丁源码,可使用Patch1、Patch2等'标识多个补丁',使用'%patch0或%{patch0}'引用 -->'一般都很稳定,很少用'
② 可选的
BuildRoot: 这个是安装或编译时使用的"虚拟目录" -->'基本不用这个描述信息了'
考虑到'多用户的环境',一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把'软件安装到上述的路径中',在打包的时候,同样依赖"虚拟目录"为"根目录"进行操作
files -->'真正的打包阶段',或者说"提取文件进行rpm打包"
后面可使用'$RPM_BUILD_ROOT' 方式'引用'
Prefix: %{_prefix}
这个主要是为了解决今后安装rpm包时,'并不一定'把软件'安装到rpm中打包的目录的情况'
这样,必须在这里'定义该标识'-->并在'编写%install脚本'的时候'引用',才能实现rpm安装时'重新指定'位置的功能
Prefix: %{_sysconfdir}
'原因同上': 但由于%{_prefix}指/usr,而对于'其他的文件',例如'/etc下的配置文件',则需要用%{_sysconfdir}标识
Vendor: 发行商或打包'组织的信息',例如RedFlag Co,Ltd
Disstribution: 发行版标识-->'Redhat Linux','Centos7.7'
Build Arch: 指编译的目标处理器架构,noarch'标识不指定',但通常都是以/usr/lib/rpm/marcros中的内容为'默认值'
Provides: 指明本软件一些'特定的功能',以便其他rpm识别
%description 软件的详细说明-->'随便写,最好详细点'--> %description 由'指令下一行开始',空行结束
补充
标识后面的内容'不能为空',如果'不想加入'该标识,前面'加上#注释掉'即可
(2)spec主体
(1)整个过程
①%prep指令
%prep: '预处理'脚本
默认: '%setup -q'
效果: '~/rpmbuild/rpmbuild/SOURCES'里的包解压到'~/rpmbuild/BUILD/%{name}-%{version}'中
预判不一致需要自定义: '%setup -n 已知的解压后的名字'
************** '分割线' **************
打包准备阶段'准备工作'执行一些命令 -->动作('解压源码包','打补丁'等),以便开始接下来的编译
一般仅包含 "%autosetup" -->这是一个'宏'
如果源码包需要解压并切换至 NAME 目录,则输入 "%autosetup -n NAME"。查看 %prep 部分了解更多信息。
Use '%%autosetup' macro to 'unpack and patch source'
辨析:setup和autosetu区别
②%build
%configure -->'标准写法'
这个'不是关键字',而是'rpm定义的标准宏命令'
意思:是执行源代码的configure配置,在'~/rpmbuild/BUILD/%{name}-%{version}'目录中进行,使用'标准写法',会引用/usr/lib/rpm/marcros中'定义的参数'
引发问题:
1) 预定义的配置'不是我们想要的'
2) 预定义的配置'并不在实际源代码./configure --help'中
3) 有些配置可能'不是configure命令' -->mysql5.6用'CMake工具'进行新版MySQL的'编译安装'
进一步:自定义
1) 删除'%configure'这个宏
2) 自己写'配置参数'即可
*********************** '举例' ***********************
./configure --prefix=%{_prefix} -->'编译'
make %{?_smp_mflags} -->'make -j 4' -->'配置'
③%check
一般'没有这个步骤'
④%install
%makeinstall 这'不是关键字',而是rpm定义的'标准宏命令' -->相关参数引自'/usr/li/rpm/macros'
说明: 一般都不是自己想要的,'删除'然后自己'重新定义'
****************** '建议使用非标准' ******************
make DESTDIR=$RPM_BUILD_ROOT install
make prefix=$RPM_BUILD_ROOT install
备注: %install'指令'主要就是为了后面的'%file服务'的。
所以,还可以使用常规的系统命令:
****************** '$RPM_BUILD_ROOT和$RPM_BUILD_DIR区别' ******************
$RPM_BUILD_ROOT是指开头定义的BuildRoot,'不自定义'就是'~/rpmbuild/BUILDROOT/' -->'这个是%file需要的'
而$RPM_BUILD_DIR通常就是指'~/rpmbuild/BUILD/' -->%install阶段'可以删除'
⑤%clean
清理'临时文件',通常内容为:
判断: '是不是在文件系统的根'-->不是的话表明是'系统相对根','可以删除'
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" && rm -rf $RPM_BUILD_DIR/%{name}-%{version}
$RPM_BUILD_ROOT '等价' ~/rpmbuild/UILDROOT '等价' %{_buildroot}
明确1: 到该阶段'自己的位置'
明确2: 移动'哪些文件'
明确3: 文件的'权限属性'之类的
明确4: '配置文件是否覆盖'
**************** '需求:如何编写%file 段' ****************
需求:由于必须在%file 中包括'所有套件中'的文件
目的:我们需要清楚编译完的套件'到底包括那些文件'?
做法:人工'模拟一次编译'的过程:
补充:%install部分使用的是绝对路径,而%file部分使用则是'相对路径' -->'相对谁'?
****** '例子' ******
'%file中必须明白,用的是相对目录'-->'BUILDROOT 对应 /'
%files
%doc README
%license LICENSE COPYING
%{_bindir}/*
%{_sbindir}/*
%{_datadir}/%{name}/
%config(noreplace) %{_sysconfdir}/*.conf
'备注:看看有日志文件logs和html放到哪里'
补充:%changelog 变更日志
(3)扩展的一些知识点
'自定义宏变量'必须使用'define来声明'
****** 'spec文件' ******
%define macro_name value
%define macro_name %(data)
****** '命令行' ******
--define 'macro_name value'
'默认'会生成的'debug-rpm'包,避免生成'debuginfo包'
则可以使用下面的命令:
echo '%debug_package %{nil}' >> ~/.rpmmacros
(4)rpmbuild命令行
rpmbuild的'命令选项'的含义
建议:可以先'rpmbuild -bp' ,再'-bc' 再'-bi' 如果没问题,'rpmbuild -ba' 生成src包与二进制包