Makefile目标内ifeq条件判断恒为true问题排查
错误根因
逻辑始终不生效的核心原因是混淆了Make的两个执行阶段:
- Makefile解析阶段:make启动后首先会扫描整个Makefile,处理所有Make原生语法,包括
ifeq条件分支判断、$(eval)/$(shell)这类内置函数的执行、变量展开,这个阶段target的命令还没开始运行,你提到的myFileA、myFileB此时还未生成。 - Target执行阶段:解析完成后make才会按照依赖顺序,逐行调用shell执行target下的命令,这时候才会生成你需要的两个文件。
你代码中的ifeq判断在解析阶段就已经完成计算,此时count_abc、count_def都还未赋值,两个空值判断相等,因此永远走打印TRUE的分支,完全不会等到grep统计出结果后再判断。你示例中能echo出22、21的数值,只是之前运行残留的旧文件被解析阶段的$(shell)提前读取到了,本质执行时机完全不符合需求。
修复方案
要实现「target执行时先生成文件,再grep统计,最后对比结果走分支」的逻辑,就不能用Make原生的ifeq语法,需要把统计、判断逻辑全部放到shell上下文中执行:
target1: # 此处保留你原本生成myFileA、myFileB的命令 count_abc=$$(grep -c "ABC" myFileA); \ count_def=$$(grep -c "DEF" myFileB); \ echo $$count_abc; \ echo $$count_def; \ if [ $$count_abc -eq $$count_def ]; then \ echo "TRUE"; \ else \ echo "FALSE"; \ fi
写法注意事项:
- shell变量前必须写双美元符
$$,避免变量被make在解析阶段提前展开 - 每行shell命令末尾加反斜杠
\,让整段逻辑在同一个shell进程中执行,否则每行命令会启动独立shell,变量无法跨命令传递 - 条件判断使用shell原生的
if [ ]语法,保证判断逻辑在grep统计完成后才运行
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

