我正在编写的程序的要求是它必须能够信任配置文件。为了实现这一点,我使用几种散列算法在编译时生成文件的散列,这会产生一个以散列为常量的标题。
对此的依赖非常简单,我的程序依赖于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,或者我只是发布了整个内容。
答案 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
)。同样地,$<
和$^
分别给出了第一个和所有先决条件。
我假设你有一个类似
的makefileCPPFLAGS+=-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