GNU Make - 非程序代码的依赖关系

时间:2010-05-23 01:41:41

标签: c gcc dependencies gnu-make

我正在编写的程序的要求是它必须能够信任配置文件。为了实现这一点,我使用几种散列算法在编译时生成文件的散列,这会产生一个以散列为常量的标题。

对此的依赖非常简单,我的程序依赖于config_hash.h,它有一个生成它的目标。

makefile看起来像这样:

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

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

我正在使用gcc的-M选项,这对于处理依赖项非常有用。如果我的标题发生变化,我的程序就会重建。

我的问题是,我需要能够判断配置文件是否已更改,以便重新生成config_hash.h。我不太清楚如何解释这种对GNU的依赖。

我尝试将config / config_file.cfg列为config_hash.h的依赖项,并为config_file.cfg提供.PHONY目标但没有成功。显然,我不能依赖-M开关来帮助我,因为配置文件不是任何目标代码的一部分。

有什么建议吗?不幸的是,我不能发布很多Makefile,或者我只是发布了整个内容。

2 个答案:

答案 0 :(得分:5)

.PHONY中声明文件是错误的。其中列出的任何依赖项都不会在文件系统中进行检查。只需将其列为哈希标头的依赖项,然后从那里开始。

答案 1 :(得分:3)

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)。同样地,$<$^分别给出了第一个和所有先决条件。

我假设你有一个类似

的makefile
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