在configure.ac中定义一个变量作为命令的输出

时间:2014-06-10 09:41:30

标签: autotools

我需要声明一个变量作为命令的输出。 我尝试过:

AC_DEFINE_UNQUOTED([SVN_REV], ["$(shell svnversion -n .)"], [Define svn revision number])

在config.h中我找到:

#define SVN_REV ""

如果我尝试:

AC_DEFINE([SVN_REV], ["$(shell svnversion -n .)"], [Define svn revision number])
config.h中的

有:

#define SVN_REV "$(shell svnversion -n .)"

如何在config.h中将SVN_REV定义为正确的值?

最好的问候

1 个答案:

答案 0 :(得分:1)

我认为你不能单独configure.ac做你想做的事。这段代码:

$(shell svnversion -n .)

似乎适用于实际运行make的时间。当configure拨打AC_OUTPUT时,您的所有AC_DEFINE都会被写入config.h。哪个是之前的 make,因此当时编写的任何内容都不会出现在make环境中。您可以在configure环境中运行此命令:

SVNVERSION_REV=`svnversion -n .`
AC_DEFINE_UNQUOTED([SVN_REV],
                   ["$SVNVERSION_REV"],
                   [Define svn revision number])

具有大致相同的效果。版本号将易于破坏(例如,修改文件并在configure之后提交它们)。解决方案是从Makefile.am驱动所有版本的内容,而不是configure.ac

将该版本信息输入autotools有点棘手。这是我用于将subversion版本插入.spec文件的某种修改版本。

首先,我使用AX_WITH_PROG(或类似内容)抓取svnversion二进制文件:

<强> configure.ac

# check for svnversion (not required, except for the maintainer)
AX_WITH_PROG([SVNVERSION], [svnversion]) 

<强> Makefile.am

# copy svnstamp to svn-revision 
# if svn-revision non-existent or svnstamp is newer
svn-revision : $(top_builddir)/svnstamp
        if test ! -f $@ -o $< -nt $@; then \
            cp $< $@; \
        fi

# always do this check to avoid staleness
.PHONY : svnstamp_

# This is supposed to do nothing
# all the work to create this file is in svnstamp_
$(top_builddir)/svnstamp : svnstamp_
        @/bin/true

# run the command only if the codebase is a svn working copy
# I've taken out the RPM related strings so you might be able
# to plug it into your code more easily
svnstamp_ :
    if test -d $(top_srcdir)/.svn ; then \
      SVN_VERSION_STAMP=`$(SVNVERSION) $(top_srcdir) -n`; \
      NEW_STAMP=`echo -n "$$SVN_VERSION_STAMP"`; \
      if test ! -f $(top_builddir)/svnstamp; then \
        echo "$$NEW_STAMP" > $(top_builddir)/svnstamp; \
      else \
        OLD_STAMP=`cat $(top_builddir)/svnstamp`; \
        if test "$$OLD_STAMP" != "$$NEW_STAMP" ; then \
          echo "$$NEW_STAMP" > $(top_builddir)/svnstamp; \
        fi \
      fi \
    else \
      if test ! -f $(top_builddir)/svnstamp \
              -o $(top_srcdir)/svn-revision \
              -nt $(top_builddir)/svnstamp; then \
        cp $(top_srcdir)/svn-revision $(top_builddir)/svnstamp; \
      fi \
    fi; \
    NEW_STAMP=`cat $(top_builddir)/svnstamp`; \
    if test "x$$NEW_STAMP" = "x"; then \
      echo " Failed to make svnstamp"; \
      exit 1; \
    fi

为了对需要版本标记的翻译单元执行此操作,您需要使它们成为svn-revision的依赖项,并在构建步骤中执行以下操作:

... -DSVN_REV=\"`cat svn-revision`\" ...