Скажем, у меня есть make-файл с правилом
%.o: %.c
gcc -Wall -Iinclude ...
Я хочу, чтобы *.o был восстановлен каждый раз, когда заголовочный файл изменяется. Вместо того, чтобы разрабатывать список зависимостей, каждый раз, когда любой заголовочный файл в /include
изменения, тогда все объекты в dir должны быть восстановлены.
Я не могу думать о хорошем способе изменить правило разместить это, я открыт для предложений. Бонусные очки, если список заголовков не должен быть трудно кодирован
Если вы используете компилятор GNU, то компилятор может собрать для вас список зависимостей. Фрагмент Makefile:
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ -MF ./.depend;
include .depend
или
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ > ./.depend;
include .depend
где SRCS
- переменная, указывающая на весь список ваших исходных файлов.
Существует также инструмент makedepend
, но он мне никогда не нравился так сильно, как gcc -MM
Как насчет чего-то вроде:
includes = $(wildcard include/*.h)
%.o: %.c ${includes}
gcc -Wall -Iinclude ...
Вы также можете использовать подстановочные знаки напрямую, но я обычно обнаруживаю, что они нужны мне в нескольких местах.
Обратите внимание, что это хорошо работает только в небольших проектах, поскольку предполагает, что каждый объектный файл зависит от каждого заголовочного файла.
Как я писал здесь gcc может создавать зависимости и компилировать одновременно:
DEPS := $(OBJS:.o=.d)
-include $(DEPS)
%.o: %.c
$(CC) $(CFLAGS) -MM -MF $(patsubst %.o,%.d,$@) -o $@ $<
Параметр '-MF' указывает файл для хранения зависимостей.
Тире в начале '-include' указывает Make продолжить работу, если файл .d не существует (например, при первой компиляции).
Обратите внимание, что в gcc, похоже, есть ошибка с опцией -o. Если задать имя объекта, скажем, obj/_file__c.o, то сгенерированный file.d будет содержать file.o, а не obj/_file__c.o.