2011-11-27 90 views
4

我可能会错过一些很明显与这个Makefile:Makefile文件始终运行目标

convert: devel/bar 
    touch convert 

init: devel/foo 
    echo 'init' 

devel/foo: 
    mkdir -p devel 
    touch devel/foo 

devel/bar: init 
    touch devel/bar 

当我运行它时,devel/bar目标始终被调用。我期望它调用convert,检查文件devel/bar,并且只有在找不到该文件时才调用该目标。如果我删除它对init的依赖关系,那么一切都按我的预期工作。我究竟做错了什么?

回答

6

您并未创建名为init的文件,因此init总是过时。因此,所有依赖它的东西总是过时的。

2

可能是没有名为init的文件?所以它试图更新devel/bar(因为它取决于init)。

考虑使用.PHONY

+0

使用'.PHONY:init'将保持'就算他创建了一个名为'init'文件init'外的日期。听起来和他想要的完全相反。 –

+0

哎呀,对不起。 '.INTERMEDIATE'可能会诀窍。但是,这就是它运行目标的原因 - 它试图首先创建一个名为init的文件。 –