GNU Make: автоматически пререквизиты не могут работать, если переименовывать заголовочные файлы - PullRequest
0 голосов
/ 09 февраля 2020

Общий Makefile для автоматического prereq, выглядит так:

SRCS := $(wildcard *.c)
OBJS := $(SRCS:%.c=%.o)
DEPS := $(OBJS:%.o=%.d)

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

include $(DEPS)

$(DEPS): %.d: %.c
    xxx 

в первый раз, сборка в порядке, сгенерированный файл .d выглядит так:

config.o config.d: config.c config.h

затем я переименовываю config .h для config2.h и измените конфигурацию. c:

-#include "config.h"
+#include "config2.h"

make снова, Makefile генерирует ошибку:

make [1]: *** Нет правил сделать целевой файл «config.h», необходимый для «config.d»

, поскольку config.d зависит от config.h, как я могу изменить мой Makefile для решения этой проблемы переименования.

1 Ответ

1 голос
/ 10 февраля 2020

Довольно просто на самом деле. Вашему файлу .d нужна эта дополнительная строка:

config.h:

Теперь, когда make обнаружит config.h, он не будет создан, он запустит несуществующий рецепт и с радостью поверит, что он имеет создано config.h. Затем он продолжает.

В руководстве говорится:

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

Как получить эту дополнительную строку?

В тот день вы запускали однострочник perl над вновь созданным .d файл. В настоящее время для современных g cc вариантов просто добавьте -MP в командную строку компилятора.

-MP Эта опция указывает CPP добавить ложную цель для каждой зависимости, кроме основного файла, в результате чего каждая зависимость ни от чего не зависит. Эти фиктивные правила обходят ошибки, которые дает make, если вы удаляете заголовочные файлы, не обновляя Makefile, чтобы он соответствовал.

Работа хороша 'un.

...