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

当从tcl调用rpmbuild时,为什么将topdir设置为其默认值?,tcl,rpm,Tcl,Rpm,我有一个tcl脚本,它是'exec'rpmbuild。执行此操作时,rpmbuild使用的“topdir”是错误的。我的主目录中有一个.rpmmacros文件,如果我手动调用rpmbuild,它可以正常工作,即“topdir”不是默认的 我在tcl脚本中添加了一个[exec rpmbuild”--showrc“]来检查topdir的值,它说“-14:_topdir%{u usrsrc}/redhat”,这是默认值 有人能解释一下为什么会出现这种情况以及如何解决它吗 我不希望必须用--define

我有一个tcl脚本,它是'exec'rpmbuild。执行此操作时,rpmbuild使用的“topdir”是错误的。我的主目录中有一个.rpmmacros文件,如果我手动调用rpmbuild,它可以正常工作,即“topdir”不是默认的

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

有人能解释一下为什么会出现这种情况以及如何解决它吗


我不希望必须用--define来指定它,因为它实际上是在一个makefile中完成的,我不想碰它(如果没有其他选择,我会这样做)。

默认情况下,TCL将在当前目录中执行。您可以使用TCL命令cd更改当前目录,例如:

cd ~username
如果topdir是一个环境变量,则可以如下设置:

set env(topdir) whatever/you/want

我的第一个检查是确保您执行相同的操作。 在命令行上执行这两个操作以确保别名或路径 不要打扰任何东西

which rpmbuild

echo 'puts [auto_execok rpmbuild]' | tclsh

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

  • 每个用户:通过在$HOME/.rpmmacros中配置RPM topdir

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

    rpmbuild --define '_topdir build' -ba package.spec
    

  • 注意:在这两种情况下,您都需要确保topdir目录具有适当的目录(BUILD、SRPM、RPM、SPECS和SOURCES)

    RHEL6中执行以下操作:

      rpm --showrc|grep topdir
      rpm --showrc|grep srcrpmdir
    
    查看正在使用的路径

    进行此更改(my topdir未设置为
    /usr/src/
    ):


    在我的例子中,这是由于变量$HOME在调用rpmbuild时没有设置。
    该变量用于搜索“/rpmmacros”文件。我建议使用命令“printenv”进行验证

    太棒了。“--define'\u topdir xxxxx'”是rpm知识中记录最不充分的部分。我已经找了很久了。挖出来的东西真是太棒了。正是我需要的。谢谢。仅仅放置
    $HOME
    不起作用-您应该使用
    %{getenv:HOME}
    我在使用相对路径时遇到问题;我认为最好始终将其作为abs目录(例如:topdir=
    pwd
    /../foo)如何在SPEC文件中定义一个宏?类似:%define\u topdir path/of/new/topdir
    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