如何在Makefile中正确使用if和else语句?已尝试两种方法均失效
在MinGW Makefile中正确使用条件判断的方法
一、修正Make内置条件判断(ifneq)的用法
你之前把ifneq写在了recipe的缩进块里,这是错误的——Make的内置条件语法(ifneq/ifeq等)属于Makefile顶层语法,不能放在需要Shell执行的命令缩进中。正确写法是用条件判断直接控制recipe内容:
true = 1 false = 0 test: ifeq ($(true), $(false)) @echo "2" else @echo "1" endif
注意:
ifeq/ifneq无需缩进,直接跟在目标后- 命令行前必须用Tab键缩进(Make对缩进格式要求严格)
- 加
@可隐藏命令本身,只显示执行结果
二、修正Shell条件判断的用法
你用了Bash风格的[[ ]]语法,但Windows下MinGW默认Shell是cmd.exe,不支持该语法,有两种解决方式:
方式1:改用cmd.exe的条件语法
适配默认cmd Shell的写法:
test: if "a12" == "a12" echo "12"
若要分行写,需用^作为换行符:
test: if "a12" == "a12" (^ echo "12"^ )
方式2:指定Make使用Bash作为Shell
如果想继续用Bash语法,需在Makefile开头指定Shell路径:
SHELL := /bin/bash .SHELLFLAGS := -euo pipefail -c test: if [[ "a12" = "a12" ]]; then \ echo "12"; \ fi
注意:
- 多行Shell命令需用
\续行,每行开头用Tab缩进 /bin/bash路径在Mingw64环境下通常有效,若路径不符可自行调整
额外注意事项
- Windows下Makefile建议使用LF换行符,避免CRLF导致命令执行异常
- recipe中所有命令行必须以Tab开头,不能用空格替代
内容的提问来源于stack exchange,提问作者Meniev
相关产品推荐
相关产品推荐

