2010-05-23 59 views
3

我写的程序的一个要求是它必须能够信任配置文件。为了达到这个目的,我使用了几种哈希算法来在编译时生成文件的哈希值,这会产生一个哈希值为常量的头文件。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) ... ... ... 

我使用-M选项的gcc,这是伟大的处理依赖。如果我的标题改变了,我的程序就会重建。

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

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

有什么建议吗?不幸的是,我不能发布很多Makefile文件,或者我只是发布了所有的东西。

+1

您是否尝试过运行“make -d”?你会得到很多的输出(有可能会减少输出,但仍然足够的变种-d,请参阅make --help),但将config_hash.h列表config_file.cfg作为依赖项应该有效。我的猜测是目标名称没有正确匹配:您的目标可能需要为$(srcdir)/config_hash.h,具体取决于config/config_file.cfg,例如... make -d应该明显。 (另外,检查gcc -M生成的.d文件也可能会对某些事情有所帮助。) – leander 2010-05-23 02:07:03

回答

5

一个makefile声明文件中.PHONY是错误的。列出的任何依赖项都不会在文件系统中检查。只需将它列为哈希头的依赖项并从那里开始。

+0

谢谢,那就是问题所在。我没有意识到.PHONY疏远了依赖关系,我认为它应该用在实际上并不构建任何东西的目标上,即使其他目标实际上依赖于它们。 – 2010-05-23 02:16:10

3

当您将config/config_file.cfg添加到config_hash.h的依存关系时,发生了什么?为什么它不是您所期望的?

config_hash.h:config/config_file.cfg 
    $(SH) genhash $< > [email protected] 

规则将重新config_hash.h如果config/config_file.cfg更近。根据config_hash.h,您的gcc生成的依赖关系会重新编译任何内容。

[email protected]变量是目标,使用这种确保你正在创建你要的文件(在你的问题,如果srcdir定义规则表示,将产生./config_hash.h,但实际上将创建./$(srcdir)/config_hash.h)。同样,$<$^分别给出第一个和所有先决条件。

我假设你有一个像

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