如何将一个命令的输出分配给一个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”之前的空格转换为制表符,最后希望这个示例能够为您工作。