最新消息:

RPM中SPEC常用路径以及宏变量

rpmbuild admin 5660浏览 0评论
  • 通过命令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

参考

转载请注明:爱开源 » RPM中SPEC常用路径以及宏变量

您必须 登录 才能发表评论!