当从tcl调用rpmbuild时,为什么topdir被设置为其默认值?

29

我有一个tcl脚本,其中使用了'exec'命令执行rpmbuild。在这样做时,rpmbuild使用的'topdir'是错误的。我在家目录中有一个.rpmmacros文件,如果我手动调用rpmbuild,则可以正常工作,即'topdir'不是默认值。

我在tcl脚本中添加了一个[exec rpmbuild "--showrc" ],来检查topdir的值,它显示为“-14:_topdir %{_usrsrc}/redhat”,这是默认值。

有人能解释一下这种情况是为什么以及如何解决吗?

我更倾向于不使用--define指定它,因为实际上是在一个makefile中完成的,我不想去修改它(如果没有其他选择,我会这样做)。

5个回答

98

更改默认的rpmbuild topdir有两种方法:

  1. 每个用户:通过在$HOME/.rpmmacros中配置RPM topdir来实现

    %_topdir    %{getenv:HOME}/rpmbuild
    
  2. 按项目:通过在 Makefile 或命令行中配置 RPM topdir

  3. rpmbuild --define '_topdir build' -ba package.spec
    
    注意:在两种情况下,您都需要确保您的topdir目录有适当的目录(BUILD、SRPM、RPM、SPECS和SOURCES)。

16
“--define '_topdir xxxxx'”是RPM中最难以理解的部分,文档也很少。我已经寻找了很长时间。 - Dave Dopson
非常感谢您找到这个。正是我所需要的。谢谢。 - Tyler Jandreau
2
仅仅放置 $HOME 是不起作用的 - 你应该使用 %{getenv:HOME} - abyss.7
我在使用相对路径时遇到了问题;我认为最好始终将其作为绝对目录(例如:topdir=pwd/../foo)。 - Blaskovicz
怎么在 SPEC 文件中定义一个宏呢?例如: %define _topdir path/of/new/topdir - Y.L.
这激发了我尝试使用每个源代码包的_topdir%_topdir %{getenv:HOME}/rpmbuild/%{name}/ - 而且它起作用了!在处理多个软件包时,文件的混合一直困扰着我,现在我可以将它们分开了。 - undefined

10

RHEL6中执行:

  rpm --showrc|grep topdir
  rpm --showrc|grep srcrpmdir

查看正在使用的路径!

进行以下更改(我的topdir未设置为/usr/src/):

vi  /usr/lib/rpm/macros
#       Path to top of build area.
#%_topdir               %{getenv:HOME}/rpmbuild
%_topdir                %{_usrsrc}/redhat

rpm --showrc|grep topdir    now shows   /usr/src/redhat/ as its BUILD dir

1

1

我的第一步检查是确保您执行相同的操作。 请在命令行上执行以下两个操作,以确保别名或路径不会干扰任何内容。

which rpmbuild

echo 'puts [auto_execok rpmbuild]' | tclsh

0
在我的情况下,这是由于调用rpmbuild时未设置变量$ HOME造成的。 该变量用于搜索“/ rpmmacros”文件。 我建议使用命令“printenv”进行验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接