GNU Make - Зависимости от непрограммного кода - PullRequest
3 голосов
/ 23 мая 2010

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

Зависимости для этого довольно просты, моя программа зависит от config_hash.h, который имеет цель, которая ее производит.

Makefile выглядит примерно так:

config_hash.h:
    $(SH) genhash config/config_file.cfg > $(srcdir)/config_hash.h

$(PROGRAM): config_hash.h $(PROGRAM_DEPS)
    $(CC) ... ... ... 

Я использую опцию -M для gcc, которая отлично подходит для работы с зависимостями. Если мой заголовок изменяется, моя программа перестраивается.

Моя проблема в том, что мне нужно знать, изменился ли файл конфигурации, чтобы заново создать файл config_hash.h. Я не совсем уверен, как объяснить такую ​​зависимость от GNU.

Я попытался перечислить config / config_file.cfg в качестве зависимости для config_hash.h и предоставить цель .PHONY для config_file.cfg, но безуспешно. Очевидно, что я не могу полагаться на ключ -M для gcc, чтобы помочь мне здесь, так как файл конфигурации не является частью какого-либо объектного кода.

Есть предложения? К сожалению, я не могу опубликовать большую часть Makefile, или я бы просто опубликовал все это.

Ответы [ 2 ]

5 голосов
/ 23 мая 2010

Объявление файла в .PHONY неверно. Любая зависимость, указанная там, не будет проверена в файловой системе. Просто перечислите его как зависимость для заголовка хеша и переходите оттуда.

3 голосов
/ 23 мая 2010

Что произошло, когда вы добавили config/config_file.cfg к зависимостям config_hash.h, и почему это не то, что вы ожидали?

Правило, подобное

config_hash.h:config/config_file.cfg
    $(SH) genhash $< > $@

, регенерирует config_hash.h, если config/config_file.cfg было более новым.Ваши сгенерированные gcc зависимости затем перекомпилируют все, что зависит от config_hash.h.

Переменная $@ является целью, используя ее, вы гарантируете, что вы создаете файл, который вы просили (В вашем вопросе, если определено srcdir, правило говорит, что оно сгенерирует ./config_hash.h, но на самом делесоздать ./$(srcdir)/config_hash.h).Точно так же $< и $^ дают первое и все предварительные условия соответственно.

Я предполагаю, что у вас есть make-файл, подобный

CPPFLAGS+=-MMD -MP
all:
# etc.
config_hash.h:config/config_file.cfg
    $(SH) genhash $< > $@
%.d %.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $*.o $<
%.d %.o:%.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $*.o $<
-include $(wildcard *.d) /dev/null
...