make中的伪目标
之前一直被make中的伪目标搞得很混乱,找了make的Manual看了后终于理清了点头绪,说下我的理解,有错的地方还望各位大大多多指正。
在makefile中,某一个目标的命令可能被执行需要以下两个前提(之一):
1 该目标是makefil中的第一个目标,也即是所谓的“默认目标”(default goal);
2 该目标是另外某一个目标的prerequisite(必要条件?汗!这个不知翻译成什么好……)
在满足这两个前提中的某一个之后,才去检查那些目标是否存在、prerequisite是否比target更新这些状况,从而最终确定该目标的命令是否要被执行。
而对于伪目标clean,因为它不是default goal,也不会是另外某一个目标的必要条件(prerequisite)(有一种情况除外,就是当需要在不同情况clean不同文件时,可以设一个clean all 的伪目标,clean all的prerequisites 是具体的clean obj1、clean obj2 等伪目标。这种情况下前面提到的clean也就大概相当于这里的clean all),所以除非我们明确的输入make clean 让clean的命令执行,单是make的话clean将不会被执行。
在《跟我一起写makefile》中有一句话“伪目标的特性是:总是被执行的. ”,这个事实上也是要在满足了前面说到的两个前提(之一)的情况下才是的。
而关于伪目标被用做prerequisite和伪目标做default goal的情况,涉及到的就更多了,这里也就不说了。