#ifdef条件编译出现意外行为

5

我有一个类似这样的 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.

出了什么问题吗?

1个回答

5

让我们尝试一些更简单的案例(*)。

hello:
    echo hello
    $(error MYERROR)

这将产生:
Makefile:3: *** MYERROR.  Stop.

注意,尽管echo出现在error之后,但error会阻止echo的输出。
现在让我们试试一些傻瓜操作:
hello:
    ifdef TAG

结果如下:

ifdef TAG
make: ifdef: No such file or directory

"#ifdef 标记"如果被解释为shell命令,就没有意义。它被解释为shell命令是因为它在一个"recipe"(Makefile规则中的命令部分)中,并且前面有一个制表符。

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

hello:
    ifdef TAG
    $(error MYERROR)

结果是Makefile:3: *** MYERROR. Stop.因此,error掩盖了ifdef...不正确的事实。

我们需要一个shell条件还是一个Make条件?如果我们希望让Make处理它(使用errorwarning),那么它必须是Make条件,因此我们不能在其前面加上TAB:

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

这符合预期。

(*) 正如你在发布前应该尝试过的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接