Страницы

Поиск по вопросам

вторник, 11 июня 2019 г.

Makefile: правильная пересборка .c файлов в случае изменения .h файлов:

Имеются файлы:
src1.c src1.h src2.c src3.c src4.c src4.h
Стоит обратить внимание, что НЕ для всех .c файлов есть свои .h файлы.
Текущий Мakefile работает, но с оговоркой: при изменении любого .h файла пересобираются ВСЕ .c файлы:
SRCS = $(wildcard *.c) HDRS = $(wildcard *.h)
%.o: %.c $(HDRS) @$(CC) -c -o $@ $<
Если раскрыть содержимое переменной $(HDRS), то автоматическая сборка будет выглядеть так:
%.o: %.c src1.h src4.h @$(CC) -c -o $@ $<
Именно поэтому, если изменился только один файл src4.h, то будут пересобраны все *.c файлы.
В другом случае, попытка сделать так, как указано в примере ниже, приведёт к ошибке, потому, что файлы src2.h src3.h не существуют:
%.o: %.c %.h @$(CC) -c -o $@ $<
Будьте любезны, подскажите, пожалуйста, как сделать правильный Makefile, чтобы при изменении src4.h пересобирался только src4.с, но не остальные.
Все мои самостоятельные попытки найти ответ на этот вопрос успехом не увенчались.
Заранее благодарю за совет.


Ответ

Можно указать зависимости в ручную в Makefile
src1.o: src1.c src1.h
и так далие для всех обектников
Или создать файлы зависимостей *.d для всех *.c файлов и включить в Makefile
SRCS = $(wildcard *.c) HDRS = $(wildcard *.h) OBJ_CATALOG=.obj/ OBJS=$(patsubst %.c,$(OBJ_CATALOG)%.o,$(SRCS)) DEPEND_CATALOG=.depend/ DEPEND=$(patsubst %.c,$(DEPEND_CATALOG)%.d,$(SRCS))
$(OBJ_CATALOG)%.o:%.c $(CXX) $(CFLAGS) -c $< -o $@
$(DEPEND_CATALOG)%.d:%.c $(CXX) -MM -I. $< | sed -e '1s/^/.obj\//' > $@
include $(DEPEND)

Комментариев нет:

Отправить комментарий