Make-файл, зависимости от заголовка

Скажем, у меня есть make-файл с правилом

%.o: %.c
 gcc -Wall -Iinclude ...

Я хочу, чтобы *.o был восстановлен каждый раз, когда заголовочный файл изменяется. Вместо того, чтобы разрабатывать список зависимостей, каждый раз, когда любой заголовочный файл в /include изменения, тогда все объекты в dir должны быть восстановлены.

Я не могу думать о хорошем способе изменить правило разместить это, я открыт для предложений. Бонусные очки, если список заголовков не должен быть трудно кодирован

90
задан Mike 7 March 2010 в 00:09
поделиться

3 ответа

Если вы используете компилятор 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

113
ответ дан 24 November 2019 в 06:57
поделиться

Как насчет чего-то вроде:

includes = $(wildcard include/*.h)

%.o: %.c ${includes}
    gcc -Wall -Iinclude ...

Вы также можете использовать подстановочные знаки напрямую, но я обычно обнаруживаю, что они нужны мне в нескольких местах.

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

23
ответ дан 24 November 2019 в 06:57
поделиться

Как я писал здесь 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.

25
ответ дан 24 November 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: