考虑此Makefile,
#!/bin/sh
IS_FIRSTRUN:=false
.PHONY: firstrun
firstrun: export IS_FIRSTRUN:=true
firstrun: run
.PHONY: run
run:
@echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
ifeq (${IS_FIRSTRUN},true)
@echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif
ifeq (${IS_FIRSTRUN},false)
@echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif
当我运行命令make run时,会发生这种情况。
make run
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>
当我运行命令make firstrun时,会发生这种情况。
make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>
如执行make firstrun时所看到的,我希望执行true的if条件,但不会执行。我想知道我为什么做错什么。
您不能在ifeq
条件语句中使用特定于目标的变量。]>
条件语句在第一次读取makefile文件时由make解析。在make实际构建目标并运行配方时,直到第二遍才定义特定于目标的变量。请参阅GNU make manual的内容:
与自动变量一样,这些值仅在目标配方的上下文中(以及在其他特定于目标的分配中)可用。
[只是因为
ifeq
出现在配方的中间并不意味着它是配方的一部分:只有缩进TAB的行才是配方的一部分。
如果要对特定于目标的变量进行检查,则需要在配方中使用shell条件构造,而不是条件构造,如下所示:
run:
@echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
@if [ '${IS_FIRSTRUN}' = true ]; then \
echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
fi
@if [ '${IS_FIRSTRUN}' = false ]; then \
echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
fi