看这篇文章的人基本都有一个想法,就是:“劳资不想用YUM的安装!不是版本太低就是文件分布太野路子”,此时我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,其中的Spec文件是制作RPM包的核心。
下面我们以制作NGINX的RPM开始介绍其制作方法。以下操作在CentOS7.4 64位系统进行(切记,不要把7上的文件装到6上去)。

1.1 起手势 安装rpm-build

yum -y install rpm-build

新建一个新用户并切换到用户上(避免权限的问题)、建立工作车间目录(官网的说法。。。),并写进环境变量里。

[root]# useradd devops    #新建用户
[root]# su - devops       #切换用户
[devops]$ echo "%_topdir %(echo $HOME)/rpmbuild" >>  ~/.rpmmacros
[devops]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

注意: 这几个新建的文件夹必须要求全部大写!全部大写!全部大写!
  
以下为目录所对应存放文件的解释:

  • BUILD:源码解压以后放的目录
  • RPMS:制作完成后的rpm包存放目录
  • SOURCES:存放源文件,配置文件,补丁文件等放置的目录【常用】
  • SPECS:存放spec文件,作为制作rpm包的文件,即:nginx.spec……【常用】
  • SRPMS:src格式的rpm包目录
  • BuiltRoot:虚拟安装目录,即在整个install的过程中临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的文件,才是真正的目录文件。最终,Spec文件中最后有清理阶段,这个目录中的内容将被删除

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显示所有的宏,以下划线开头:

  • 一个下划线:定义环境的使用情况,
  • 二个下划线:通常定义的是命令,
    为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置

1.2 理解Spec脚本中各个变量

rpm的配置文档还算是比较有调理性的,按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件引用等,其中需要注意的地方为:虚拟路径的位置,以及宏的定义。
 
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.3 制作开始RPM包

所需要打包的文件都放在如下目录:

[devops]$ pwd
$HOME/rpmbuild/SOURCES

编写SPEC文件目录如下:

[devops]$ pwd
$HOME/rpmbuild/SPEC

以下为Nginx Spec file的实例:

cat nginx.spec
%define _prefix /usr/local/nginx    //预定义的prefix目录
%define _logpath /var/log/weblog    //预定义日志目录
Name: nginx
Version: 1.12.1
Release: 1%{?dist}
Summary: The Nginx HTTP and reverse proxy server
Group: Applications/System
License: GPLv2
URL: https://nginx.org
Packager: Atlantis <XXX@XXX.com>
Vendor: XXX-XXX
Source0: %{name}-%{version}.tar.gz  //引用的源码文件
Source1: nginx.conf                 //引用配置文件
Source2: nginx                      //引用System-V风格的Service服务
Source3: nginx.logrotate            //引用日志轮转的配置文件
BuildRoot: %_topdir/BUILDROOT       //虚拟根目录
Requires: libxslt-devel,openssl-devel,pcre-devel    //所依赖的软件包%description
NGINX is the heart of the modern web, powering half of the world’s busiest sites and applications. The company's comprehensive application delivery platform combines load balancing, content caching, web serving, security controls, and monitoring in one easy-to-use software package.%prep                               //编译前准备工作,这里指定的就是Setup,有条件也可以指定编译器
%setup -q%build                              //编译参数,这个看到这里的人基本都懂,没啥讲的,最后一个参数可以使用并行编译: make -j 6
./configure \--user=nginx \--group=nginx \--prefix=%{_prefix} \--http-log-path=%{_logpath}/access.log \--error-log-path=%{_logpath}/error.log \--pid-path=/var/run/nginx.pid \--with-http_dav_module \--with-http_flv_module \--with-http_realip_module \--with-http_addition_module \--with-http_xslt_module \--with-http_sub_module \--with-http_random_index_module \--with-http_degradation_module \--with-http_secure_link_module \--with-http_gzip_static_module \--with-http_ssl_module \--with-http_stub_status_module \--with-pcre \--with-threads \--with-stream \--with-ld-opt=-Wl,-E
make %{?_smp_mflags}%install                            //安装步骤
rm -rf %{buildroot}                 //保证虚拟根的干净
make install DESTDIR=%{buildroot}   //install 到虚拟根
%{__install} -p -d -m 0755 %{buildroot}%{_logpath}  //定义一个日志目录并赋予其权限,这个文件会在编译时自动生成,因此要声明
%{__install} -p -D -m 0644 %{SOURCE1} %{buildroot}%{_prefix}/conf/nginx.conf //复制SOURCE1中的文件到虚拟根中
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx //复制SOURCE2中的文件到虚拟根中
%{__install} -p -D -m 0644 %{SOURCE3} %{buildroot}%{_prefix}/conf/nginx.logrotate //复制SOURCE3中的文件到虚拟根中%pre                                //安装前准备操作
if [ $1 == 1 ]; then                // 这里的1为安装;0为卸载/usr/sbin/useradd -r nginx -s /sbin/nologin 2> /dev/null
fi%post                               //安装后准备操作
if [ $1 == 1 ]; thenecho "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profilesource /etc/profilecp %{_prefix}/conf/nginx.logrotate /etc/logrotate.d/nginx
fi%preun                              //卸载前准备操作
if [ $1 == 0 ]; then/etc/init.d/nginx stop 2>&1 /dev/null/usr/sbin/userdel -r nginx 2> /dev/null
fi%postun
if [ $1 == 0 ]; then                //卸载后准备操作rm -f /etc/logrotate.d/nginx
fi%clean
rm -rf %{buildroot}%files                              //定义rpm包安装时创建的相关目录及文件。在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。
%defattr(-,root,root,0755)
%{_prefix}
%dir /var/log/weblog
%attr(644,root,root) %{_prefix}/conf/nginx.conf
%attr(755,root,root) /etc/rc.d/init.d/nginx%changelog
* Fri Feb 22 2019 <XXX@XXX> - 1.12.1-3
- Initial Version
- Update Installtion
- Add Logrotate Feature
- Fix Uninstall Bug With logrotate# End Of nginx.spec

转载于:https://blog.51cto.com/luweiv998/2354385

RPM包制作之Spec文件详解相关推荐

  1. 【收藏】RPM包制作和spec文件详解

    1.How to create an RPM package/zh-cn https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh- ...

  2. linux spec 脚本,RPM包制作之Spec文件详解

    看这篇文章的人基本都有一个想法,就是:"劳资不想用YUM的安装!不是版本太低就是文件分布太野路子",此时我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包 ...

  3. linux安装spec编译器,RPM包制作之Spec文件参数详解

    看这篇文章的人基本都有一个想法,就是:"劳资不想用YUM的安装!不是版本太低就是文件分布太野路子",此时我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包 ...

  4. 提取原rpm包里的SPEC文件及重新打包

    一.概要 目的是要修改原rsyslog rpm包的systemd rsyslog.service文件,添加一行"ExecStartPre=/bin/bash -c "/usr/bi ...

  5. linux rqm包制作 spec文件详解

    看这篇文章的人基本都有一个想法,就是:"不想用YUM的安装!不是版本太低就是文件分布太野路子",此时我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,其 ...

  6. JAR 包及MANIFEST.MF 文件详解

    常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了:而另一种是使用 JET 来进行 ...

  7. RPM的制作(.spec文件)

    参考的资料:<鸟哥的Linux基础篇>(此书第三版使用centos5.x) 使用系统:centos6.5 rpm和srpm文件都是对/root/rpmbuild/里面的源码和配置文件编译打 ...

  8. RPM打包过程及spec文件解释

    随着Linux风靡全球,越来越多的开发者喜欢采用RPM格式来发布自己的软件包,大多数的公司文件服务器会要求项目的资材作成rpm包.那么RPM软件包是怎样制作的呢? 这篇文章就带大家了解一下RPM包作成 ...

  9. 【Linux学习】RPM包制作

    1,package环境准备 1)打包命令安装(推荐直接上rpmdevtools) yum -y install rpm-build 或者直接安装rpmdevtools,这个工具还包含一些其他的工具,同 ...

最新文章

  1. 如何简化Exchange 2007 OWA URL访问
  2. sublime text使用小技巧
  3. aop面向切面编程到底是干嘛的?
  4. 2万人同时访问 nodejs_面向前端工程师的Nodejs入门手册(一)
  5. linux线程handler,Handler从源码角度理解
  6. 开源天生就不是为了赚钱!
  7. JSP之jsp内置标签
  8. 【图像加密】基于matlab Logistic混沌+Arnold置乱图像加密解密【含Matlab源码 1281期】
  9. ArcGIS土壤稳定性评估(附练习数据下载)
  10. 微信平台自动获取Token
  11. Axure的灯箱效果说明
  12. GHOST重装系统详解
  13. 苹果怎么给软件加密码_给SIM卡设置密码被锁了怎么办?解锁的PUK码在哪?
  14. 吹了一个多月的联想Z5竟然是低端机,指望靠这个崛起就是痴人说梦
  15. PS2021 入门使用技巧
  16. 前端中push数组元素到新数组方法
  17. 快速寻找9位数内的自幂数
  18. 【胖虎的逆向之路】04——脱壳(一代壳)原理脱壳相关概念详解
  19. 运用计算机辅助设计的药物实例,计算机辅助设计在药物研发中的应用现状探究...
  20. php购物车程序,PHP购物车程序设计

热门文章

  1. 新的JavaScript库邀请程序员使用Canvas进行创意编程
  2. 前阿里 P9 级员工称离婚是模拟测试,已回滚复婚!
  3. Mac 上 iterm2 和 VSCode 终端中的字体设置建议
  4. 在Apache的POI XWPFRun对象分隔文本行
  5. centos7虚拟机使用docker搭建swoole环境
  6. 监听发现局域网dropbox客户端broadcast-dropbox-listener
  7. java mybatis向mysql数据库插入中文出现乱码
  8. Seafile:用挂载盘客户端让企业在线编辑云端文件
  9. 博客园Markdown新建笔记
  10. postgresql 可调试