You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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))) \
)

改动说明

  1. 移除macro开头的$(info),将打印逻辑移至job_$(1)规则的命令序列中,确保打印操作在规则执行阶段触发
  2. 使用@echo实现执行阶段的打印:
    • @用于隐藏Makefile对echo命令本身的输出,只显示打印内容
    • 转义双引号\"是为了匹配原$(info)的输出格式
  3. 完整保留了原有的macro定义和foreach循环逻辑,满足需求约束

执行后的输出

"JOB: job1"
ifort -c job.f90
"JOB: job2"
ifort -c job.f90
"JOB: job3"
ifort -c job.f90

内容的提问来源于stack exchange,提问作者TobiR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:23:19