Você pode inspecionar MAKECMDGOALS
para detectar a presença de um objetivo ao criar outro objetivo. Faça com que a %: %.icl
run detecte a presença da meta run
ou faça com que a meta run
inspecione quais executáveis são mencionados como destinos. Se você passar mais de um executável como um destino, o primeiro método fará com que cada um seja executado logo após ser construído, enquanto o segundo faz com que todas as execuções ocorram no final.
A desvantagem dessa abordagem é que ela não se adapta bem a outros recursos. Por exemplo, se você definir um destino com vários executáveis como dependências, o método com run
target não funcionará.
EXE = foo bar experimental
released: foo bar
run: $(filter $(EXE), $(MAKECMDGOALS))
set -e; for x in $^; do ./$x; done
Aqui make released run
não executará nada.
O que eu normalmente faço neste caso é definir um destino de "execução" para cada executável. Isso mantém cada alvo expresso como uma única palavra, o que é uma grande vantagem. É simples e não quebra outros recursos.
$(EXE): %.run: %
./$(@:.run=)
all.run: $(EXE:=.run)
Em seguida, executo make {foo,bar}.run
se quiser criar e testar foo
e bar
ou make all.run
para criar e executar todos eles.