http://www.jinbuguo.com/pkgmanager/redhat/rpmbuild.html
http://www.jinbuguo.com/pkgmanager/redhat/rpm.html
描述
rpmbuild 用于创建软件的二进制包和源代码包。
一个"包"包括文件的归档以及用来安装和卸载归档中文件的元数据。
元数据包括辅助脚本、文件属性、以及相关的描述性信息。
软件包有两种:
二进制包,用来封装已经编译好的二进制文件;
源代码包,用来封装源代码和要构建二进制包需要的信息。
必须选择下列"模式"之一:
(1)从 spec 构建, (2)从 Tar 构建, (3)重新构建, (4)重新编译, (5)显示配置
通用选项
下列选项可以用于所有不同的模式。
-?, --help
打印详细的帮助信息
--version
打印一行详细的版本号信息
--quiet
输出尽可能少的信息,通常只有错误信息才会显示出来。
-v 输出冗余信息,例如进度之类的信息。
-vv 输出大量冗长的调试信息
--rcfile FILELIST
FILELIST 中冒号分隔的每个文件都被 rpm 按顺序读取,从中获得配置信息。
只有列表中的第一个文件必须存在,波浪线将被替换为 $HOME 。默认值是:
/usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc
--pipe CMD
将 rpm 的输出通过管道送到 CMD 命令。
--dbpath DIRECTORY
使用 DIRECTORY 中的数据库,而不是默认的 /var/lib/rpm
--root DIRECTORY
以 DIRECTORY 作为根文件系统进行操作。这意味着将使用 DIRECTORY 中的数据库来进行依赖性检测,
并且任何操作(比如安装时的 %post 和构建时的 %prep)都将 chroot 到 DIRECTORY 下执行。
-D, --define='MACRO EXPR'
将 MACRO 宏的值定义为 EXPR
(1,2)构建选项
构建命令的一般形式是
rpmbuild -bSTAGE|-tSTAGE [rpmbuild-options] FILE ...
如果需要根据某个 spec 文件构建,那么使用 -b 参数。
如果需要根据某个 tar 归档(可能是压缩过的)中的 spec 文件构建,那么使用 -t 参数。
STAGE 指定了要完成的构建和打包的阶段,必须是下列其中之一:
a 构建二进制包和源代码包(在执行 %prep, %build, %install 之后)
b 构建二进制包(在执行 %prep, %build, %install 之后)
p 执行 spec 文件的"%prep"阶段。这通常等价于解包源代码并应用补丁。
c 执行 spec 文件的"%build"阶段(在执行了 %prep 之后)。这通常等价于执行了"make"。
i 执行 spec 文件的"%install"阶段(在执行了 %prep, %build 之后)。这通常等价于执行了"make install"。
l 执行一次"列表检查"。spec 文件的"%files"段落中的宏被扩展,检测是否每个文件都存在。
s 只构建源代码包
此外,还可以使用下列选项:
--buildroot DIRECTORY
在构建时,使用 DIRECTORY 目录覆盖默认的 BuildRoot 值
--clean
在打包完成之后删除构建树
--nobuild
不执行任何实际的构建步骤。可用于测试 spec 文件。
--noclean
不执行 spec 文件的"%clean"阶段(即使它确实存在)。
--nocheck
不执行 spec 文件的"%check"阶段(即使它确实存在)。
--nodeps
不检查编译依赖条件是否满足
--rmsource
在构建后删除源代码(也可以单独使用,例如"rpmbuild --rmsource foo.spec")
--rmspec
在构建之后删除 spec 文件(也可以单独使用,例如"rpmbuild --rmspec foo.spec")
--short-circuit
直接跳到指定阶段(也就是跳过指定阶段前面的所有步骤),只有与 c 或 i 或 b 连用才有意义。
仅用于本地调试。以此种方法构建出的包将被标记为"依赖关系不满足",以阻止其被正常使用。
--target PLATFORM
在构建时,将 PLATFORM 解析为 arch-vendor-os ,并以此设置宏 %_target, %_target_cpu, %_target_os 的值。
(3,4)重新构建和重新编译选项
有两种构建方法:
rpmbuild --rebuild|--recompile SOURCEPKG ...
使用 --recompile 的话,rpmbuild 将安装指定的源代码包(SOURCEPKG),然后进行准备、编译、安装。
而使用 --rebuild 的话,还会在 --recompile 的基础上再额外构建一个新的二进制包。
在构建结束时,构建目录将被删除(就好像用了 --clean),源代码和 spec 文件也将被删除。
(5)显示配置
rpmbuild --showrc
将显示 rpmbuild 使用的、在 rpmrc 和 macros 配置文件中定义的选项的值。
一:跟宏定义相关的文件可分为两类:
1、通过macro files引用类:rpmrc 配置文件
/usr/lib/rpm/rpmrc #全局配置
/usr/lib/rpm/redhat/rpmrc #全局指定系统配置
/etc/rpmrc #系统相关
~/.rpmrc #用户自定义
这4个文件都是rpmrc相关的内容,rpmrc主要是用来定义一些跟平台特型相关的一些选项,比如
optflags: i386 -O2 -g -march=i386 -mtune=i686
optflags: i686 -O2 -g -march=i686
如果optflags引用的是i686,则optflags的值就是:-O2 -g -march=i686,因此这里就可以扩展用来制定macro files
macro files: /usr/lib/rpm/macros:/etc/rpm/macros
这个选项需要在编译阶段定义MACROFILES,否则macrofiles会加载默认的路径,具体的参考rpm源代码:/lib/rpmrc.c: setDefaults方法。
2、直接定义类: Macro 配置文件
/usr/lib/rpm/macros #全局配置
/usr/lib/rpm/macros.d #全局配置扩展配置
/usr/lib/rpm/redhat/macros #全局指定系统配置
/etc/rpm/macros #系统配置
~/.rpmmacros #用户自定义配置
/usr/lib/rpm/macros、/usr/lib/rpm/macros.d、/usr/lib/rpm/redhat/macros、/etc/rpm/、~/.rpmmacros
直接定义顾名思义就是直接写在文件里面的,这四个文件的优先级为:用户自定义相关:~/.rpmmacros > 系统相关的配置:/etc/rpm/ > 全局扩展配置:/usr/lib/rpm/macros.d/* > 全局的配置:/usr/lib/rpm/macros
二:查看宏定义:
1、rpm –eval “%{_sysconfdir}”
rpm –showrc | grep _sysconfdir
2、比如你修改~/.rpm/macros,修改rpmbuild的%_topdir 为:
%_topdir %{getenv:PWD}/rpmbuild
查看 rpm –eval “%{_topdir}” 或 rpm –showrc | grep _topdir 或rpmbuild –showrc | grep _topdir
3、一些比较重要的定义
3.1、rpmbuild目录相关的宏定义:
%{_topdir} %{getenv:HOME}/rpmbuild
%{_builddir} %{_topdir}/BUILD
%{_rpmdir} %{_topdir}/RPMS
%{_sourcedir} %{_topdir}/SOURCES
%{_specdir} %{_topdir}/SPECS
%{_srcrpmdir} %{_topdir}/SRPMS
%{_buildrootdir} %{_topdir}/BUILDROOT
3.2、操作系统、python、perl、node.js相关的一些宏定义
cat /etc/rpm/macros.dist
#dist macros.
%centos_ver 7
%centos 7
%jettech_ver 7
%jettech 7
%rhel 7
%dist .el7.centos
%el7 1
3.3、spec里面一些比较重要的宏
%{setup}/%{autosetup}:setup是包含在autosetup里面,宏的具体定义如下:
# One macro to (optionally) do it all.
# -S Sets the used patch application style, eg ‘-S git’ enables
# usage of git repository and per-patch commits.
# -N Disable automatic patch application
# -p Use -p for patch application
%autosetup(a:b:cDn:TvNS:p:)\
%setup %{-a} %{-b} %{-c} %{-D} %{-n} %{-T} %{!-v:-q}\
%{-S:%global __scm %{-S*}}\
%{-S:%{expand:%_scm_setup%{-S*} %{!-v:-q}}}\
%{!-N:%autopatch %{-v} %{-p:-p%{-p*}}}
也就是auotosetup相对于setup多扩展了一个-S参数。重要参数的意义如下
-n 解压到BUILD目录下面的目录名
-q 解压tarball的时候不显示具体的文件列表信息,这个选项是setup才有的选项,autosetup上面是没有放开这个选项
-c 解压之前先产生目录
-S patch/hg/git/git_am/quilt/bzr 对于-S选项会再调用其他的宏%_scm_setup%{-S*},比如git,则会调用如下git宏,干的事就是把源码包初始化成一个git项目包
# Git
%__scm_setup_git(q)\
%{__git} init %{-q}\
%{__git} config user.name “%{__scm_username}”\
%{__git} config user.email “%{__scm_usermail}”\
%{__git} add .\
%{__git} commit %{-q} -a\\
–author “%{__scm_author}” -m “%{name}-%{version} base”
4、宏定义和修改
4.1 、通过–define关键字来扩展
rpmbuild -ba rpmbuild/SPECS/openstack-cinder.spec –define ‘_sysconfdir /test’
在spec里面通过%{_testdir}来引用
install -p -D -m 640 etc/cinder/cinder.conf.sample %{buildroot}%{_testdir}/cinder/cinder.conf
这样就把默认的_sysconfdir从/etc变成test
4.2、直接修改宏定义文件
直接修改上面定义macros的4个文件里面的宏
在spec文件里面定义
%define macro_name value
%define macro_name %(data)
宏使用,
%macro_name
%macro_name 1 2 3(1,2,3为参数传递给宏)
%0:宏名字
%*:传递给宏的所有参数
%#:传递给宏的参数个数
%1,参数1
%2,参数2
参考:
https://docs.fedoraproject.org/ro/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch09s07.html
https://docs.fedoraproject.org/ro/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-customizing-rpm.html