【问题标题】:How can you force recompilation of a single file in a Makefile?如何强制重新编译 Makefile 中的单个文件?
【发布时间】:2011-03-19 07:27:23
【问题描述】:

这个想法是一个项目有一个包含__DATE____TIME__ 的文件。在不明确更改修改日期的情况下重新编译它可能会很酷。

edit: $(shell touch -c ..) 如果只是笨拙,可能是一个很好的解决方案。

【问题讨论】:

  • 这可能是您的问题的错误解决方案。一些版本控制工具可以转储出源版本的详细信息。在你的构建过程中有一点脚本黑客,这些细节会被内置到你的代码中。如果您必须检查源代码并在十年后重新构建也没关系 - 您的版本信息仍将反映该标签的详细信息。
  • @Steve314:他更可能想要一个提及构建号和构建日期的关于框。
  • @Ken - 如果是这样,版本控制工具的技巧就是正确的方法。脚本黑客没有理由不能将版本详细信息放入 about 框的代码(或资源文件)中,并且将内部版本号放入 about 框可能需要容易忘记的手动干预,否则。 make、编译器和文件系统都不知道你的内部版本号。
  • 使用外部工具转储版本信息?这听起来不是很多平台。用什么工具做的?

标签: c++ c makefile autotools


【解决方案1】:

一种方法是在运行make 之前删除相应的目标文件(.o.obj)。这将触发重新编译(和重新链接)而不更改源文件修改日期。

【讨论】:

    【解决方案2】:

    标准的习惯用法是让目标文件(不是源文件!)依赖于一个不存在且没有规则或依赖关系的目标(这个目标通常称为 FORCE),就像这样

    always-recompile.o: FORCE
    FORCE:
    

    但是,如果以某种方式创建了名为“FORCE”的文件,这将中断。使用 GNU make,您可以改用特殊目标 .PHONY,它没有此限制,但需要您有一个明确的规则来重建该文件:

    always-recompile.o:
            $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c
    
    .PHONY: always-recompile.o
    

    更多详情请见http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

    【讨论】:

    • 你应该做 ".PHONY: FORCE" 因为 always-recompile.o 不是一个虚假的目标。使用“.PHONY: FORCE”,是否创建名为 FORCE 的文件并不重要。
    • 这真的有效吗? GNU make 手册听起来像是虚假目标不能作为真实目标的依赖项。
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2012-09-05
    • 2019-02-01
    相关资源
    最近更新 更多