gpt4 book ai didi

bash - Ifdef 条件意外行为

转载 作者:行者123 更新时间:2023-12-04 03:51:44 24 4
gpt4 key购买 nike

我有一个包含如下命令的 Makefile:

#Makefile
hello:
echo 'hello'
echo $(TAG)
ifdef TAG
$(warning MYWARNING)
else
$(error MYERROR)
endif

我这样使用它:

# make TAG='1.0' hello

我希望该命令执行 echo 'hello',然后 echo $(TAG) 和 $(warning MYWARNING) 但我得到:

Makefile:17: MYWARNING
Makefile:19: *** MYERROR. Stop.

怎么了?

最佳答案

让我们尝试一些更简单的情况(*)。

hello:
echo hello
$(error MYERROR)

这会产生:

Makefile:3: *** MYERROR.  Stop.

请注意,error 会阻止 echo,即使它是在之后出现的。

现在让我们尝试一些愚蠢的事情:

hello:
ifdef TAG

结果是:

ifdef TAG
make: ifdef: No such file or directory

“ifdef TAG”,解释为 shell 命令, 没有意义。它被解释为一个 shell 命令,因为它在一个配方中并且前面有一个 TAB。

现在让我们把它们结合起来:

hello:
ifdef TAG
$(error MYERROR)

结果是 Makefile:3: *** MYERROR。停止。 所以 error 掩盖了 ifdef... 不正确的事实。

我们想要一个 shell 条件,还是一个 Make 条件?如果我们想让 Make 对它采取行动(带有 errorwarning),那么它必须是一个 Make 条件,所以我们不能在它前面加上 TAB:

hello:
ifdef TAG
$(warning MYWARNING)
else
$(error MYERROR)
endif

这按预期工作。

(*) 因为你应该在发布之前尝试过。

关于bash - Ifdef 条件意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64368002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com