如何从makefile运行系统调用并将答案保存在变量中

时间:2011-10-17 16:17:27

标签: c shell makefile command

我正在尝试设置要在编译期间使用的变量值。 我尝试在单独的makefile目标中执行此操作

svnversion:
    SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')
    $(info svn_rev = $(SVN_REV))

我已经读过这是设置变量值的方法。 然而,当我运行'make'时,我看到了:

SVN_REV=613
svn_rev = 

所以变量似乎是空的。之后我希望在编译发生时(在其他目标中)存在这个变量。是这样的吗?或者我应该在svnversion目标中添加'export'命令?以及如何处理SVN_REV变量? $(SVN_REV)或$$(SVN_REV)。

谢谢

2 个答案:

答案 0 :(得分:4)

您实际上是在行末尾的子shell中分配值SVN_REV,

你可能想要的是:

svnversion:: SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')

svnversion:
        $(info svn_rev = $(SVN_REV))

设置目标时设置变量。

如果这不是预期的,假设您想对变量进行一些处理,那么您需要使用行语义末尾的可怕; \使每一行成为前一行的延续。 。如果您正在引用shell变量(如第一行中评估的那个),那么您需要在变量名之前使用$$语法

e.g。

svnversion:
        SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]'); \
        echo svn_rev = $$SVN_REV

但是因为它在shell中,所以你不能在$(info命令中使用该变量,因为这是在目标评估之外发生的。

答案 1 :(得分:1)

您不能在规则中的不同行之间使用变量,甚至不能在不同规则之间使用变量。每一行都在它自己的shell中执行,所以没有办法以这种方式传递信息。 (Petesh现在正如我刚才所说)

如果您需要存储中间信息,请使用以下文件:

 foo:
         uname -m > current_arch
         ...

 bar:
         gcc -m $$(cat current_arch) ...
         ...

如果正在执行的命令不是太耗时而且不依赖于在构建过程中何时调用它,您也可以设置一个宏:ant

 ARCH = $$(uname -m)

 bar:
         gcc -m $(ARCH) ...

但这不是设定的变量,而是宏替换。调用make bar时传递给shell的实际命令是:

         gcc -m $(uname -n)

然后将执行uname命令。