- 通过命令
rpm --showrc
查看实现代码。另外直接通过rpm --eval "%{centos}"
来查看具体对应路径。 - 比如我们要查看
%{_bindir}
的路径,就可以使用命令rpm --eval "%{ _bindir}"
来查看。另外,所有的宏都可以在/usr/lib/rpm/macros里找到。
直接定义类
`/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
通过macrofiles引用类
/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,因此这里就可以扩展用来制定macrofiles
macrofiles: /usr/lib/rpm/macros:/etc/rpm/macros
这个选项需要在编译阶段定义MACROFILES,否则macrofiles会加载默认的路径,具体的参考rpm源代码:/lib/rpmrc.c:setDefaults方法。
如何宏定义查看
rpm –eval “%{_sysconfdir}”
rpm –showrc | grep _sysconfdir
比如你修改~/.rpmmacros,修改rpmbuild的_top_dir为:
%_topdir /root/test/rpmbuild
这时候想验证看吓topdir是否已经改变,则可以通过
rpm –eval “%{_topdir}”
来查看是否真的改变了,当然也可以通过
rpm –showrc | grep _topdir
一些比较重要的定义
rpmbuild目录相关的宏定义:
%{_topdir} %{getenv:HOME}/rpmbuild
%{_builddir} %{_topdir}/BUILD
%{_rpmdir} %{_topdir}/RPMS
%{_sourcedir} %{_topdir}/SOURCES
%{_specdir} %{_topdir}/SPECS
%{_srcrpmdir} %{_topdir}/SRPMS
%{_buildrootdir} %{_topdir}/BUILDROOT
操作系统、python、perl、node.js相关的一些宏定义
这些宏定义一般放在/etc/rpm/下面,比如跟系统相关的,如下:
cat /etc/rpm/macros.dist
#dist macros.
%centos_ver 7
%centos 7
%rhel 7
%dist .el7.centos
%el7 1
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”
宏定义、修改
宏修改, 通过–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
直接修改宏定义文件
直接修改上面定义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
Macros mimicking autoconf variables
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_lib} lib (lib64 on 64bit systems)
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datadir} %{_prefix}/share
%{_includedir} %{_prefix}/include
%{_oldincludedir} /usr/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
RPM directory macros
%{_topdir} %{getenv:HOME}/rpmbuild
%{_builddir} %{_topdir}/BUILD
%{_rpmdir} %{_topdir}/RPMS
%{_sourcedir} %{_topdir}/SOURCES
%{_specdir} %{_topdir}/SPECS
%{_srcrpmdir} %{_topdir}/SRPMS
%{_buildrootdir} %{_topdir}/BUILDROOT
Build flags macros
%{_global_cflags} -O2 -g -pipe
%{_optflags} %{__global_cflags} -m32 -march=i386 -mtune=pentium4 # if redhat-rpm-config is installed
Other macros
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_docdir} %{_datadir}/doc
参考
- https://www.ibm.com/developerworks/cn/linux/l-rpm/index.html
- https://rpm-packaging-guide.github.io/
- 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
转载请注明:爱开源 » RPM中SPEC常用路径以及宏变量