rpmbuilld 宏的使用详解

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
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sourcetree是一个非常好用的git客户端,它提供了可视化的界面帮助开发者进行多人协作开发过程中的各种git操作,比如push、pull、add、commit、merge等等。 在使用Sourcetree之前,你需要先下载、安装和配置好环境。然后你可以打开Sourcetree,它会展示一个初始界面,其中包含了本地仓库的相关信息。 Sourcetree是一个强大的工具,但本文只介绍了一些常用的功能,并没有记录一些使用频率较低的功能。工具的目的是帮助我们提高工作效率,所以我们只需要掌握最有用的部分即可。 在正文部分,你可以了解到Sourcetree的各种功能,以及对应的git命令和如何使用这些功能。它详细介绍了各种常用操作,帮助你更好地使用Sourcetree进行版本控制。[1,2] 使用Sourcetree可以很方便地进行分支的检出和关联远程分支。当你使用命令行检出分支后,你还需要执行一些操作来与远程分支进行关联。但是Sourcetree非常友好,当你点击克隆按钮时,它会自动帮助你与远程仓库进行关联。 总之,Sourcetree是一个功能强大且易于使用的git客户端,它为开发者提供了可视化的界面来管理和执行各种git操作,帮助我们更高效地进行协同开发。[1,2,3]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Sourcetree 使用详解](https://blog.csdn.net/weixin_43837354/article/details/105936140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [SourceTree使用教程图文详解](https://blog.csdn.net/qq_41153943/article/details/120814918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值