如何在Makefile中强制重新编译单个文件?

6
这个想法是一个项目只有一个文件,其中包含__DATE____TIME__。重新编译它而不显式更改修改日期可能很酷。
编辑:如果只是笨拙的话,$(shell touch -c ..)可能是一个好的解决方案。

1
这可能不是解决您问题的正确方法。一些版本控制工具可以输出源代码的版本详细信息。在构建过程中进行一些脚本操作,这些详细信息将被构建到您的代码中。即使您在十年后需要检出源代码并重新构建,您的版本信息仍将反映该标签的详细信息。 - user180247
@Steve314:更有可能的是他想要一个关于框,其中提到了构建编号和构建日期。 - Ken Bloom
@Ken - 如果是这样,版本控制工具技巧就是正确的方法。脚本技巧可以将版本详细信息放入代码(或资源文件)中的关于框中,获取构建号码可能需要容易被遗忘的手动干预。无论是make、编译器还是文件系统都不知道您的构建号码。 - user180247
用外部工具转储版本信息?这听起来不太适用于多平台。是什么工具可以做到这一点? - j riv
2个回答

8

标准惯例是让目标文件(而不是源代码文件!)依赖于一个不存在且没有规则或依赖关系的目标(这个目标通常被称为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 了解更多详情。

1
你应该加上“.PHONY: FORCE”,因为always-recompile.o不是一个虚拟目标。有了“.PHONY: FORCE”,即使创建了一个名为FORCE的文件也不会有影响。 - camh
这真的有效吗?GNU make手册似乎表明虚假目标不能作为实际目标的依赖项。 - zwol

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接