Вот простой пример, который я использовал для проверки своего ответа:
touch {a,b,c,d}.bin mpi{a,b,c,d}.bin
, чтобы создать несколько пустых тестовых файлов, и мой Makefile, основанный на вашем:
BINS = $(shell echo *.bin)
.PHONY: $(BINS)
run: $(BINS)
*.bin:
echo "bin file: " ./$@
mpi*.bin:
echo "mpi file: " ./$@
Это ключздесь правило для файлов с префиксом следует правилу без префикса.В противном случае правило с префиксом будет переопределено.
Похоже, это работает для различения файлов с префиксом и без префикса, но дает следующий вывод:
~/tmp$ make
Makefile:10: warning: overriding commands for target `mpia.bin'
Makefile:7: warning: ignoring old commands for target `mpia.bin'
Makefile:10: warning: overriding commands for target `mpib.bin'
Makefile:7: warning: ignoring old commands for target `mpib.bin'
Makefile:10: warning: overriding commands for target `mpic.bin'
Makefile:7: warning: ignoring old commands for target `mpic.bin'
Makefile:10: warning: overriding commands for target `mpid.bin'
Makefile:7: warning: ignoring old commands for target `mpid.bin'
echo "bin file: " ./a.bin
bin file: ./a.bin
echo "bin file: " ./b.bin
bin file: ./b.bin
echo "bin file: " ./c.bin
bin file: ./c.bin
echo "bin file: " ./d.bin
bin file: ./d.bin
echo "mpi file: " ./mpia.bin
mpi file: ./mpia.bin
echo "mpi file: " ./mpib.bin
mpi file: ./mpib.bin
echo "mpi file: " ./mpic.bin
mpi file: ./mpic.bin
echo "mpi file: " ./mpid.bin
mpi file: ./mpid.bin
Я уверенчто есть способ подавить эти предупреждения или сделать это лучше, но этот подход, похоже, работает.