目录
前言
安装rpmbuild
rpmbuild制作rpm 包
同时生成devel包
修改rpm、重新制作rpm包
RPM 打包 工具
SPEC文件
rpmbuild的目录和Spec宏变量和参数说明
preamble部分
Body 部分
标题宏变量/工作目录
spec文件信息
符号说明
CMake制作rpm包
HelloWorld
更多SPEC例子
报错记录
前言
打rpm 包需要的东西有 源码、spec文件(打rpm包的脚本)、rpmbuild工具。
官网教程:RPM Packaging Guide--https://rpm-packaging-guide.github.io/#rpm
安装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 #安装后执行的脚本//安装之后需要执行的动作
cp /usr/local/httpd/bin/apachectl /etc/init.d/myhttpd
sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/myhttpd
%preun #卸载前执行的脚本//卸载该rpm包所执行的一些操作
/etc/init.d/myhttpd stop
%postun #卸载后执行的脚本
%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代我们执行build 和install ,我们在外面make install,然后rpmbuild 打包结果)
注意:
以上阶段如果没有操作的话,为空,但是不能有空行,例如build阶段为空应写为
%build
%install
xxxxxxxx
错误示例:
%build
%install
xxxxxxxx
rpm包制作阶段
spec 文件编写好以后就可以进行打包了。
在SPECS文件夹下执行命令:
rpmbuild -ba hello.spec
如果出错了可以通过 不同的命令来看是在打包的那一步出了问题。
rpmbuild -ba spec_name.spec <--编译,既生成源码src.rpm又生成二进制rpm
rpmbuild -bb spec_name.spec <--编译,只生二进制的rpm
rpmbuild
-bs 只生成src的rpm
-bp 执行到pre
-bc 执行到 build段
-bi 执行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)
修改rpm、重新制作rpm包
提取spec文件
rpmrebuild -s helloworld.spec helloworld.x86_64.rpm
解压原rpm包,得到helloworld
rpm2cpio helloworld.rpm|cpio -div
修改or替换helloworld里面的内容
创建文件夹/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
标题创建打包工作目录
执行
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区别参见:http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm)
Spec文件包含preamble和body两部分,preamble部分主要包含一些包的元数据,body部分主要用于打包,安装等
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 此版本软件的发布次数。通常,将初始值设置为1%{?dist},并该版本的每次新发布递增。生成新版本的软件时,重置为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 installed后需要打包进rpm的文件列表,用逗号或空格分隔。在SPEC文件中,可以有多个Requires条目,每个条目单独一行 |
| 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构建环境定义。唯一的例外是要构建的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 构建之前的处理,例如,创建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. 将安装在最终用户系统中的文件列表。(也就是需要打包进rpm包的文件列表--绝对路径) |
| A record of changes that have happened to the package between different 不同版本或发行版本之间对包所做更改的记录。 |
标题宏变量/工作目录
默认工作路径的确定,通常由在/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显示所有的宏,以下划线开头:
一个下划线:定义环境的使用情况,
二个下划线:通常定义的是命令,
为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置
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: 修改历史
详细介绍在:https://www.cnblogs.com/ilanni/p/4312581.html
https://blog.51cto.com/luweiv998/2354385
————————————————
原文链接:https://blog.csdn.net/csdn_763871244/article/details/99937600
符号说明
什么是 1%{?dist} : 如果%{dist}未定义返回1,否则返回1%{dist},
if 0%{?flag}; then
foo
fi
如果%{flag}被定义了,条件语句为:0%{flag},执行if block; 反之,条件语句为:0, 不执行if block。
注意:%{?flag}前必须加0,否则如果%{?flag}未定义,if语句停止执行并退出。
%{?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的,最后发布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
CMake制作rpm包
(摘自:https://blog.csdn.net/qq_29493353/article/details/90205415)
也可以使用cmake 制作rpm包,CMake中包含的三个工具(cmake cpack ctest)中的cpack工具。他可以帮助快速的打包发布你的程序。
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")
# 安装前和安装后执行的shell脚本, 会打包到RPM中,安装时执行。这里可扩展性很强, 放在源码目录下即可
# 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,只需要执行cpack -G TGZ 或者 cpack -G ZIP就可打包成相应的格式。
结论
以上主要是用cpack打包开发程序,其实可以针对很多东西制作rpm包,比如很多依赖已经用源码安装好的开发坏境,也可以打包,公司tlinux的提供了兼容性。比如mysql++已经装在系统/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做单元测试。
更多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 #---> 授权协议
URL: inmoonlight@.163.com
buildroot: %{_topdir}/BUILDROOT #---> 指定生产车间(非常重要,因在生成rpm过程中执行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.............
#安装前的准备工作,此处可写入执行脚本
%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}
#定义执行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,可执行文件0755
%attr(0755,root,root) /usr/local/nginx/sbin/nginx #---> 针对单一文件设置权限
%{_prefix}/*
%{_prefix}/local/nginx/conf/%{CONFIGFILE}
#制作完成后的清理工作
%clean
rm -rf %{buildroot}
#安装后的执行工作,此处可写入执行脚本
%post
chkconfig --add nginx
chkconfig --level 345 nginx on
#变更日志
%changelog
#---------------------------------------------------------------------------------------------
# 2.1 介绍区域的SOURCE0下增加如下
# Source0: %{name}-%{version}.tar.gz
# Source1: index.html
# Source2: init.nginx
# Source3: fastcgi_params
# Source4: nginx.conf
# 2.2 安装区域增加如下
# 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 执行到 prep 阶段
# -bc 执行到 build 阶段
# -bi 执行到 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
网上的资料是这样说的:
本段是安装段,其中的命令在安装软件包时将执行,如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服务的。所以,还可以使用常规的系统命令:
引用install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
但是我每次使用make install时候都会报错make: *** No rule to make target ‘install’。换成install -d的写好就可以,我也不明白是为什么。后来发现,使用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里面直接写内容,这样改起来也方便。