【问题标题】:GNU Make - Dependencies on non program codeGNU Make - 对非程序代码的依赖
【发布时间】:2010-05-23 10:18:54
【问题描述】:

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

对此的依赖非常简单,我的程序依赖于 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 的依赖项,并为 config_file.cfg 提供 .PHONY 目标但没有成功。显然,我不能依靠 -M 切换到 gcc 来帮助我,因为配置文件不是任何目标代码的一部分。

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

【问题讨论】:

  • 你试过运行“make -d”吗?你会得到很多输出(-d 的变体可能会提供更少的输出但仍然足够,请参阅 make --help),但是将 config_hash.h list config_file.cfg 作为依赖项应该可以工作。我的猜测是目标名称没有正确匹配:您的目标可能需要是 $(srcdir)/config_hash.h,具体取决于 config/config_file.cfg,例如... make -d 应该很明显。 (此外,检查 gcc -M 生成的 .d 文件也可能会有所帮助。)

标签: c gcc dependencies gnu-make


【解决方案1】:

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

【讨论】:

  • 谢谢,这就是问题所在。我没有意识到 .PHONY 疏远了依赖关系,我认为它应该用于实际上不构建任何东西的目标,即使其他目标确实依赖它们。
【解决方案2】:

当您将 config/config_file.cfg 添加到 config_hash.h 的依赖项时发生了什么,为什么不符合您的预期?

类似的规则

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

如果 config/config_file.cfg 是较新的,则将重新生成 config_hash.h。然后,您的 gcc 生成的依赖项将根据 config_hash.h 重新编译任何内容。

$@ 变量是目标,使用它可确保您创建您要求的文件(在您的问题中,如果定义了 srcdir,则规则说它将生成 ./config_hash.h,但实际上会创建 @987654330 @)。同样$&lt;$^ 分别给出第一个和所有先决条件。

我假设你有一个类似的生成文件

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

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多