在 makefile 中,尽管显示变量具有不同的值,但未覆盖该变量也会导致错误的 ifeq

  • 本文关键字:变量 覆盖 ifeq 错误 makefile 显示 makefile
  • 更新时间 :
  • 英文 :


考虑这个 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
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>

当我运行命令时,首先运行,就会发生这种情况。

make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>

正如您在执行make 首次运行时所看到的,我期望执行 true 的 if 条件,但它没有。我想知道我为什么做错了什么,做错了什么。

不能在条件语句中使用特定于目标ifeq变量。

条件语句在 makefile 中读取时由 make 在第一次传递期间解析。 特定于目标的变量直到第二遍才定义,此时 make 实际上是构建目标并运行配方。 请参阅GNU制作手册,其中说:

与自动变量一样,这些值仅在目标配方的上下文中可用(以及其他特定于目标的赋值(。

仅仅因为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

最新更新