如何将一个命令的输出分配给一个Makefilevariables

我需要有条件地执行一些make规则,只要安装的Python大于某个版本(比如说2.5)。

我以为我可以做一些像执行:

python -c 'import sys; print int(sys.version_info >= (2,5))' 

然后使用输出(如果可以,则为'1',否则为'0')在ifeq make语句中。

在一个简单的bash shell脚本中,它只是:

 MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'` 

但是这在Makefile中不起作用。

有什么build议么? 我可以使用任何其他明智的解决方法来实现这一点。

像在MY_VAR=$(shell echo whatever)一样使用make shell builtin

 me@Zack:~$make MY_VAR IS whatever me@Zack:~$ cat Makefile MY_VAR := $(shell echo whatever) all: @echo MY_VAR IS $(MY_VAR) 

eval包装任务正在为我工​​作。

 set_opts: $(eval DOCKER_OPTS = -v $(shell mktemp -d -p /scratch):/output) @true 

注意:这里的@true阻止Make从思考没有nothing to be done

我正在写一个答案,以提高可见性,解决问题的实际语法。 不幸的是,一个人可能会看到的微不足道的事情,可能会成为一个非常令人头痛的人寻找一个合理的问题的简单答案。

将以下内容放入“Makefile”文件中。

 MY_VAR := $(shell python -c 'import sys; print int(sys.version_info >= (2,5))') all: @echo MY_VAR IS $(MY_VAR) 

您希望看到的行为如下(假设您安装了最新的python)。

 make MY_VAR IS 1 

如果你复制并粘贴上面的文本到Makefile中,你会得到这个吗? 可能不会。 你可能会得到一个像这里报告的错误:

makefile:4:***缺less分隔符。 停止

为什么:因为虽然我个人使用了一个真正的选项卡,堆栈溢出(尝试有帮助)将我的选项卡转换为一些空格。 你,沮丧的互联网公民,现在复制这个,认为你现在有我使用的文字。 make命令现在读取空格,并发现“all”命令格式不正确。 因此,复制上述文本,粘贴它,然后将“@echo”之前的空格转换为制表符,最后希望这个示例能够为您工作。