Как заставить makefile использовать правило шаблона?

#makefile #rules

#makefile создать файл #Правила

Вопрос:

Имея этот простой makefile:

 VPATH = include
CC := gcc
CFLAGS := -I include -Wall -pedantic

%: %.o include.o
    $(CC) -o $@ $^

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@

lt;

Когда я запускаю его с именем программы (тем же именем, что и исходный код с расширением .c), я ожидаю, что будет запущено первое правило (поскольку я предоставил только имя без расширения) и второе, потому что для первого правила существует %.o предварительное условие, которое точновторое правило.

Наличие этих файлов в pwd:

 client.c  include  makefile  server6.c  server.c
 

Теперь, если я сделаю make server :
Это так

 gcc -I include -Wall -pedantic    server.c   -o server
 

Другими словами, второе правило не срабатывает. нет никакого шага с созданием объектных файлов, даже если объектный файл указан в первом правиле в качестве предварительного условия. Так как же это возможно? Make — это просто игнорирование предварительного условия и попытка сделать только с помощью первого правила. Как это исправить?

Ответ №1:

Это потому, что make имеет встроенное правило для %: %.c и make всегда будет выбирать правило шаблона, которое может напрямую создавать цель поверх правила шаблона, для которого требуется другое правило шаблона:

Однако обратите внимание, что правило, предварительные условия которого действительно существуют или упоминаются, всегда имеет приоритет над правилом с предварительными условиями, которые должны быть созданы путем объединения в цепочку других неявных правил.

Вы можете запустить make -r , чтобы удалить все встроенные правила, или удалить их самостоятельно, добавив:

 % : %.c
 

в ваш makefile.

Вы можете просмотреть все встроенные правила, выполнив make -p -f/dev/null