如何在 Makefile 中使用 if 和 else 语句 - Windows?

问题描述 投票:0回答:1

问题

我试图在 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

ifneq 声明:

test:
    ifneq ($(true), $(false))
        echo "1";
    
    else
        echo "2";
    endif

结果 Windows Powershell:

ifneq (1, 0)
process_begin: CreateProcess(NULL, ifneq (1, 0), ...) failed.
make (e=2): Le fichier spmingw32-make: *** [makefile:28: test] Error 2

Git Bash 结果:

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

结果 Git Bash 和 Windows Powershell:

makefile:28: *** missing separator.  Stop.
makefile
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.