Build 为什么';触摸屏';将makefile与所有源文件一起调用不会重建任何内容?我怎样才能解决这个问题?

Build 为什么';触摸屏';将makefile与所有源文件一起调用不会重建任何内容?我怎样才能解决这个问题?,build,makefile,touch,Build,Makefile,Touch,我有一些源文件,如file1、file2和file3以及Makefile: tar: file1 file2 file3 @echo hello 现在,当我触摸file1时,它会重建file1和tar 但是当我触摸所有源文件和生成文件时,它不会重建任何东西。它应该重建所有源文件。为什么会这样 简单的解决方案是我触摸所有文件,但不触摸制作文件,但当我有20个源文件时,这就变得很困难了。解决方案是什么?make的工作方式是比较目标和源上的时间戳。该规则的一般格式为: target: sou

我有一些源文件,如
file1
file2
file3
以及
Makefile

tar: file1 file2 file3
    @echo hello
现在,当我触摸file1时,它会重建
file1
tar

但是当我触摸所有源文件和生成文件时,它不会重建任何东西。它应该重建所有源文件。为什么会这样


简单的解决方案是我触摸所有文件,但不触摸制作文件,但当我有20个源文件时,这就变得很困难了。解决方案是什么?

make的工作方式是比较目标和源上的时间戳。该规则的一般格式为:

target: source(s)
    action(s)        
在这种情况下,当您运行
make
时,它将查看目标的时间戳(
tar
),并询问该时间戳是否早于任何源的时间戳(
file
file2
file3
)。如果目标比任何源都旧,则认为它已过期,从而触发规则的操作运行

问题是,这个规则除了回显输出外,什么都不做。运行后,
tar
仍然具有与以前相同的时间戳。下次运行
make
时,它将执行完全相同的操作,因为启动条件(时间戳)没有更改

您可以通过让规则作为其操作之一接触tar文件来实现这一点

tar:file1 file2 file3
@接触焦油
@回声你好
现在,它的行为应该如预期的那样

$make
make:“tar”是最新的。
$touch文件3
$make
你好
$make
make:“tar”是最新的。

当然,在一个典型的Makefile中,您的规则不仅仅是
echo
。如果它正在构建某些内容,则通常规则的目标(在本例中为
tar
)会因构建操作而修改,因此通常不需要显式使用
touch

我认为您忽略了一点,即我正在对所有文件运行touch命令,以更新所有文件的时间戳。这意味着所有源文件时间戳都将更新,tar应该重新生成。但在这里,在运行touch命令后,它返回“'tar'是最新的”@Harsh By“all files”这里的“all files”是指所有文件,包括
tar
?如果您触摸tar file1 file2 file3或
touch*
并运行make,它会说它已经是最新的,因为tar不比任何源文件旧。是的,我触摸了
touch*
。现在我明白你的意思了,tar的时间戳与sourcefiles的时间戳进行了比较。早些时候,我误解了源文件的时间戳与之前存储在某处的时间戳相比较。我现在明白你的意思了。谢谢。除了
tar
,我如何处理所有文件?这取决于您的文件名,最简单的方法是使用通配符,如
touch file*
。。。但是除了你文章中的示例文件名之外,我不知道你的文件名叫什么,很难说。据我所知,
touch
实用程序中没有“除此之外的所有”功能。当您触摸时,是否可能同时触摸了tar文件?