RPMS杂谈(四)spec编写(上)

一    基础知识

百度文库spec

(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阶段'可以删除'

辨析:prefix和DESTDIR区别

⑤%clean

清理'临时文件',通常内容为:

判断: '是不是在文件系统的根'-->不是的话表明是'系统相对根','可以删除'

[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" && rm -rf $RPM_BUILD_DIR/%{name}-%{version}

$RPM_BUILD_ROOT  '等价'  ~/rpmbuild/UILDROOT   '等价'  %{_buildroot}

%file

明确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包与二进制包

别人踩的坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值