quando várias regras de padrão correspondem a um alvo
oGNU faz manual diz
É possível que mais de uma regra padrão atenda a esses critérios. Nesse caso, o make escolherá a regra com o menor caule (ou seja, o padrão que corresponde mais especificamente).
Então me surpreendeu isso:
$ touch make_specific.cpp
$ cat Makefile.general_first
%.o: %.cpp
@echo using general rule
$(CXX) -c $ touch make_specific.cpp
$ cat Makefile.general_first
%.o: %.cpp
@echo using general rule
$(CXX) -c $< -o $@
%_specific.o: %_specific.cpp
@echo using specific rule
$(CXX) -c $< -o $@
$ make -B -f Makefile.general_first make_specific.o
using general rule
g++44 -c make_specific.cpp -o make_specific.o
lt; -o $@
%_specific.o: %_specific.cpp
@echo using specific rule
$(CXX) -c $ touch make_specific.cpp
$ cat Makefile.general_first
%.o: %.cpp
@echo using general rule
$(CXX) -c $< -o $@
%_specific.o: %_specific.cpp
@echo using specific rule
$(CXX) -c $< -o $@
$ make -B -f Makefile.general_first make_specific.o
using general rule
g++44 -c make_specific.cpp -o make_specific.o
lt; -o $@
$ make -B -f Makefile.general_first make_specific.o
using general rule
g++44 -c make_specific.cpp -o make_specific.o
Múltiplas regras padrão correspondem ao alvo e, como a haste para o%_specific.o : %_specific.cpp
regra ('fazer', neste caso) é mais curta do que a haste para o%.o : %.cpp
regra, eu esperava que a regra específica fosse selecionada, mas não é.
o que estou perdendo?