我有以下示例:
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))) \
)
首先打印$(info "JOB: $(1)")
行,然后打印编译命令:
"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
您的问题在于 make 的思考方式(解析还是调用配方)。请注意,配方是 shell 命令(无论 shell 是什么),无需
shell
在配方中调用 make 函数。请尝试以下操作:注意:您可以使用
$$(info JOB: $(1))
而不是echo 'JOB: $(1)'
。它会$(info JOB: job_jobN)
在解析过程中被扩展为 (这是使用foreach-eval-call
:eval
扩展其参数的结果)。这只是该规则的另一个方案。与任何方案一样,当规则被触发时,它会被扩展,并在扩展结果传递给shell之前在预期的时间产生预期的输出。并且 asinfo
扩展为空字符串,因此不会将任何内容传递给shell。