如何在Makefile的foreach循环中实现编译前同步打印任务信息?
问题:调整Makefile中任务信息与编译命令的输出顺序
原Makefile代码:
LIST_JOB = job1 job2 job3 define macro $(info "JOB: $(1)") job_$(1): job.f90 ifort -c job.f90 $(shell touch job.f90) endef all: rule rule: $(foreach job,$(LIST_JOB), job_$(job)) $(foreach job,$(LIST_JOB), \ $(eval $(call macro,$(job))) \ )
当前执行输出:
"JOB: job1" "JOB: job2" "JOB: job3" ifort -c job.f90 ifort -c job.f90 ifort -c job.f90
需求:保留macro和foreach循环的前提下,让任务信息打印紧跟对应编译命令,达成如下输出顺序:
"JOB: job1" ifort -c job.f90 "JOB: job2" ifort -c job.f90 "JOB: job3" ifort -c job.f90
解决方案
原因分析
原来的$(info)是Makefile解析阶段执行的指令,会在所有规则执行前批量输出所有信息;而编译命令属于执行阶段的操作,因此出现先打印全部信息再执行编译的顺序。
修改后的Makefile代码
LIST_JOB = job1 job2 job3 define macro job_$(1): job.f90 @echo "\"JOB: $(1)\"" ifort -c job.f90 $(shell touch job.f90) endef all: rule rule: $(foreach job,$(LIST_JOB), job_$(job)) $(foreach job,$(LIST_JOB), \ $(eval $(call macro,$(job))) \ )
改动说明
- 移除macro开头的
$(info),将打印逻辑移至job_$(1)规则的命令序列中,确保打印操作在规则执行阶段触发 - 使用
@echo实现执行阶段的打印:@用于隐藏Makefile对echo命令本身的输出,只显示打印内容- 转义双引号
\"是为了匹配原$(info)的输出格式
- 完整保留了原有的
macro定义和foreach循环逻辑,满足需求约束
执行后的输出
"JOB: job1" ifort -c job.f90 "JOB: job2" ifort -c job.f90 "JOB: job3" ifort -c job.f90
内容的提问来源于stack exchange,提问作者TobiR
相关产品推荐
相关产品推荐

