2010-07-22 786 views
5

这个想法是一个项目有一个文件,其中有__DATE____TIME__。重新编译它可能会很酷,但不会明确更改其修改日期。如何强制重新编译Makefile中的单个文件?

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

+1

这可能是您的问题的错误解决方案。某些版本控制工具可以转储源版本的详细信息。在构建过程中有一些脚本hackery,并将这些细节内置到您的代码中。如果您必须在十年内查看源代码并重新构建,则无关紧要 - 您的版本信息仍会反映该代码的详细信息。 – Steve314 2010-07-22 00:40:54

+0

@ Steve314:更有可能他想要一个提到构建号和构建日期的about box。 – 2010-07-22 00:55:43

+0

@Ken - 如果是这样,版本控制工具技巧是正确的。没有理由说明为什么脚本hackery不能将版本信息放入代码(或资源文件)中,而将内部版本号码放入关于框的内容可能需要轻易忘记的人工干预。编译器和文件系统都不知道你的内部版本号。 – Steve314 2010-07-22 01:08:50

回答

8

标准成语是有目标文件(未在源文件!)取决于目标不存在,也没有规则或依赖关系(该目标通常称为FORCE),像这样

always-recompile.o: FORCE 
FORCE: 

但是,如果名为“FORCE”的文件以某种方式被创建,这将会中断。随着GNU让你可以改用特殊目标.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 2010-07-22 00:44:12

+0

这实际上工作吗? GNU使手工听起来像假目标不起真正目标的依赖性。 – zwol 2010-07-22 00:48:03

1

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