3

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

对此的依赖非常简单,我的程序依赖于 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 make 的依赖。

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

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

4

2 回答 2

5

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

于 2010-05-23T02:07:44.523 回答
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)。同样$<$^分别给出第一个和所有先决条件。

我假设你有一个像

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
于 2010-05-23T02:06:21.053 回答