Tenho o seguinte exemplo:
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))) \
)
que imprime as $(info "JOB: $(1)")
linhas primeiro e depois os comandos de compilação:
"JOB: job1"
"JOB: job2"
"JOB: job3"
ifort -c job.f90
ifort -c job.f90
ifort -c job.f90
Existe alguma maneira de imprimir as linhas de cabeçalho logo antes da compilação (claro, mantendo o loop macro
e o foreach
loop)? Isso significaria a seguinte ordem:
"JOB: job1"
ifort -c job.f90
"JOB: job2"
ifort -c job.f90
"JOB: job3"
ifort -c job.f90
Seu problema surge quando o comando make pensa (analisando vs. chamando receitas). Observe que as receitas são comandos do shell (qualquer que seja o shell), não sendo necessário chamar a função make
shell
em uma receita. Tente o seguinte:Observação: você poderia usar
$$(info JOB: $(1))
em vez deecho 'JOB: $(1)'
. Ele seria expandido como$(info JOB: job_jobN)
durante a análise sintática (isso é uma consequência do uso deforeach-eval-call
:eval
expande seu parâmetro). E isso seria apenas mais uma receita para esta regra. Como qualquer receita, quando a regra é acionada, ela seria expandida, produzindo a saída esperada no tempo esperado, pouco antes do resultado da expansão ser passado para o shell. E comoinfo
expande como uma string vazia, nada seria passado para o shell.