我有一些源文件一样file1
,file2
并且file3
和Makefile
:
tar: file1 file2 file3
@echo hello
现在,当我touch file1
重建file1
和重建tar
。
但是,当我touch
所有源文件和时Makefile
,它不会重建任何内容。它应该重建所有源文件。为什么这样?
一个简单的解决方案是我touch
所有文件Makefile
,但是,当我说20个源文件时,它将变得很困难。解决办法是什么?
进行工作的方式是比较目标和源上的时间戳。规则的一般格式为:
target: source(s)
action(s)
在这种情况下,当您运行make
,它会看目标的时间戳(tar
),并要求timstamp是否比任何来源的日期和时间旧(file
,file2
,file3
)。如果目标比任何源都旧,则认为它已过时,这将触发规则的运行。
问题在于该规则除了回显输出外不执行任何操作。运行后,tar
仍然具有以前的时间戳。下次运行时make
,它将执行完全相同的操作,因为开始条件(时间戳)没有改变。
您可以通过使规则触摸tar文件作为其动作之一来按预期进行这项工作。
tar: file1 file2 file3
@touch tar
@echo hello
现在它应该表现出预期的效果。
$ make
make: `tar' is up to date.
$ touch file3
$ make
hello
$ make
make: `tar' is up to date.
当然,在典型的Makefile中,您的规则会做得更多echo
。如果正在构建内容,通常通过tar
构建操作来修改规则的目标(在本例中为),因此touch
通常不需要显式使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句