我试图在 Makefile 中使用 if 和 else 语句,但我尝试的所有方法都不起作用。
OS : Windows
Text Editor : VScode
I am using mingw64 and I run the Makefile with MinGW32-make
我在终端上输入的命令是:
MinGW32-make test
这些变量位于 Makefile 的顶部:
true = 1
false = 0
test:
ifneq ($(true), $(false))
echo "1";
else
echo "2";
endif
ifneq (1, 0)
process_begin: CreateProcess(NULL, ifneq (1, 0), ...) failed.
make (e=2): Le fichier spmingw32-make: *** [makefile:28: test] Error 2
ifneq (1, 0)
/usr/bin/sh: -c: line 1: syntax error near unexpected token `1,'
/usr/bin/sh: -c: line 1: `ifneq (1, 0)'
MinGW32-make: *** [makefile:28: test] Error 2
test:
if [[ "a12" = "a12" ]]; then
echo "12";
fi
makefile:28: *** missing separator. Stop.
ifeq
、ifneq
等是makefile操作,不是shell操作。这意味着它们不能由配方中的 TAB 字符缩进,因为配方中由 TAB 字符缩进的所有内容都被假定为 shell 命令并被传递到 shell。
如果你这样写:
test:
ifneq ($(true), $(false))
echo "1"
else
echo "2"
endif
然后它就会起作用,尽管这可能不是你想要做的(你的例子看起来很简单,与你真正想做的事情相去甚远,我们的任何建议可能都不会那么有帮助——当出现时有示例,最好尽可能接近您真正想做的事情,同时仍然简单)。
您的 shell 脚本示例失败的原因是配方中的每个逻辑行都被发送到不同的 shell。所以当你写:
test:
if [[ "a12" = "a12" ]]; then
echo "12";
fi
make 首先仅使用第一行调用 shell:
if [[ "a12" = "a12" ]]; then
。这不是有效的 shell 脚本,因此您会收到错误消息。如果您想将多个物理行发送到一个 shell 脚本中,则必须使用反斜杠将它们继续到单个逻辑行中:
test:
if [[ "a12" = "a12" ]]; then \
echo "12"; \
fi