Makefile中ifeq条件判断执行报错,如何排查解决?
问题原因
你犯了Makefile语法的核心错误:GNU Make的ifeq条件判断属于Make的语法规则,不能缩进写在目标的命令块里。
缩进的内容会被Make当成要执行的shell命令,而系统中根本不存在ifeq这个可执行程序,所以才会抛出“找不到指定文件”的错误。
修正方案
提供两种可行的修正方式,按需选择:
方式一:提前用Make条件语法定义变量
把条件判断移到目标规则之外,提前根据LOGGER的值设置好编译用的变量:
LOGGER=Mongo # Mongo logger LOGGER_MONGO_BINARY=loggerMongoApp LOGGER_MONGO_FOLDER=logger-service-mongo # Redis logger LOGGER_REDIS_BINARY=loggerRedisApp LOGGER_REDIS_FOLDER=logger-service-redis # 提前根据LOGGER值设置编译变量 ifeq ("${LOGGER}", "Mongo") LOGGER_BINARY=${LOGGER_MONGO_BINARY} LOGGER_FOLDER=${LOGGER_MONGO_FOLDER} else ifeq ("${LOGGER}", "Redis") LOGGER_BINARY=${LOGGER_REDIS_BINARY} LOGGER_FOLDER=${LOGGER_REDIS_FOLDER} endif build_logger: @echo Building logger binary (${LOGGER}-based)... cd ../${LOGGER_FOLDER} && \ set GOOS=linux && \ set GOARCH=amd64 && \ set CGO_ENABLED=0 && \ go build -o ${LOGGER_BINARY} ./cmd/api @echo Done!
方式二:在命令块中使用Shell条件判断
如果要把逻辑写在目标命令内,需要改用Shell的if语法,注意Make变量与Shell变量的转义:
LOGGER=Mongo # Mongo logger LOGGER_MONGO_BINARY=loggerMongoApp LOGGER_MONGO_FOLDER=logger-service-mongo # Redis logger LOGGER_REDIS_BINARY=loggerRedisApp LOGGER_REDIS_FOLDER=logger-service-redis build_logger: @echo Building logger binary (${LOGGER}-based)... @if [ "${LOGGER}" = "Mongo" ]; then \ BINARY=${LOGGER_MONGO_BINARY}; \ FOLDER=${LOGGER_MONGO_FOLDER}; \ elif [ "${LOGGER}" = "Redis" ]; then \ BINARY=${LOGGER_REDIS_BINARY}; \ FOLDER=${LOGGER_REDIS_FOLDER}; \ fi; \ cd ../$$FOLDER && \ set GOOS=linux && \ set GOARCH=amd64 && \ set CGO_ENABLED=0 && \ go build -o $$BINARY ./cmd/api @echo Done!
额外注意点
- Makefile的命令行必须用Tab键缩进(不能用空格),确保你的缩进格式正确。
- Windows环境下用
cd替代chdir更通用,路径分隔符保持../${LOGGER_FOLDER}即可适配当前执行环境。 - 用
&&串联命令,确保前序命令执行成功后才会继续后续编译步骤,避免无意义的错误执行。
内容的提问来源于stack exchange,提问作者vbulash
相关产品推荐
相关产品推荐

