使用命令行选项--old-file后,Make仍然可以重建目标。为什么呢?

时间:2015-08-19 11:00:21

标签: makefile gnu-make

来自docs

  

-o FILE   
  --old-file=FILE   
  --assume-old=FILE   
  
       即使文件FILE比它早,也不要重新编译文件        先决条件,并且不会因为更改而重新制作任何内容        文件。本质上,该文件被视为非常古老及其规则        被忽略了。


还有elsewhere

  

如果您已经在某些文件时更改了头文件   确实需要重新编译,这样做已经太晚了。相反,你可以使用   -o FILE标志,用于将指定文件标记为“旧”(* note Summary   选项:选项摘要。)。这意味着文件本身不会   重新制作,其他任何内容都不会在其帐户上重新制作。按照这个   过程:



现在,以下 - 相当简单 - makefile:

# Create an out-of-date target, where 'new' is "newer" than "all".
$(shell touch all)
$(shell sleep 0.1)
$(shell touch new)

all:: new
    echo '$@'



正在运行,我得到:

$ make -oall
echo 'all'
all

真是个灾难!

上面的引文没有读过:

  

不要重新制作文件 文件 ,即使它比较旧    先决条件,并且不会因为

的变化而重新制作任何内容

但是,完全按照这样做,告诉Make,allold-file,并没有“阻止”它重新构建它。什么?!

1 个答案:

答案 0 :(得分:1)

make重建目标all,因为您已将其指定为double-colon规则。如果我们要将makefile改为

# Create an out-of-date target, where 'new' is "newer" than "all".
$(shell touch all)
$(shell sleep 1)
$(shell touch new)

all: new
    echo '$@'

运行make -oall会产生预期输出make: 'all' is up to date.

[注意] 在我的系统上,我不得不将睡眠超时增加到1,以重现问题中的错误。 OS X 10.10.4 上的 GNU Make 4.1

[免责声明] 我不是100%确定为什么使用双冒号规则处理-o选项的方式不同,我找不到任何建议原因。我将对此作出解释,希望能有所帮助。

GNU Make Manual

  

双冒号规则有点模糊,通常不太有用;它们为用于更新目标的方法根据导致更新的先决条件文件而不同的情况提供了一种机制,这种情况很少见。

基于此,我建议双冒号规则的部分默默无闻是由于它们的用途,它们不遵守-o选项规范,即

  

更新目标...取决于哪些先决条件文件导致更新

考虑到这一点,如果任何 先决条件 >,则应执行双冒号规则 makefile或命令行中指定的任何其他选项