关于Makefile的两个基本问题(参考大作“跟我一起写makefile”)

首先,明确一下Makefile的 规则

    target ... : prerequisites ...
            command
            ...
            ...


target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)

问题1:makefile 中一条命令执行出错的话,其余的命令还会继续执行吗?

参考答案:

每当命令运行完后,make会检测每个命令的返回码,如果命令返回成功,那么make会执行下一条命令,
当规则中所有的命令成功返回后,这个规则就算是成功完成了。如果一个规则中的某个命令出错了(命令退出码非零),
那么make就会终止执行当前规则
,这将有可能 终止所有规则的执行

有些时候,命令的出错并不表示就是错误的。例如mkdir命令,我们一定需要建立一个目录,如果目录不存在,
那么mkdir就成功执行,万事大吉,如果目录存在,那么就出错了。我们之所以使用mkdir的意思就是一定要有
这样的一个目录,于是我们就不希望mkdir出错而终止规则的运行。

为了做到这一点,忽略命令的出错,我们可以在Makefile的命令行前加一个减号“-”(在Tab键之后),
标记为不管命令出不出错都认为是成功的
。如:

clean:
    -rm -f *.o



问题2:make 命令后面不带任何目标(target)的话,会去运行 .PHONY 声明的伪目标吗?

参考答案:

第一点,关于伪目标的概念。先看下面一段:

 .PHONY: clean
 clean:
        rm *.o temp

其中关键字 .PHONY 声明后面的 clean 是一个伪目标,伪目标要点如下:
1)“伪目标”并不是一个文件,只是一个标签,因而称其“伪目标”。
2)由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。
3)只有通过显示地指明这个“目标”才能让其生效。
4)“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。
5)为了避免和文件重名,使用一个特殊的标记“.PHONY”来显式地指明一个目标是“伪目标”,
   向make说明,不管是否有这个文件,这个目标就是“伪目标”。因而, 要运行“clean”这个目标,
   只有“make clean”这样。(一般情况下)



第二点,make 后面不带任何 target 时,会去运行 .PHONY 声明的伪目标吗?

通过上面澄清的关于伪目标的概念,我们知道要运行伪目标的话,必须是“make 伪目标”这样的形式。
因而如果单单只是一个 make 的话,是不会去运行 PHONY 声明的伪目标的。(我又一次错了,哎!)

单是一个 make ,不带任何target的话,会默认运行 makefile 中的第一个目标 (第一名向来都是很特殊啊,呵呵)。
因而“make 伪目标”只是一般情况,如果伪目标恰好就是 makefile 文件的第一个目标,由于默认单独
一个 make 会运行第一个目标,因而这时单独的 make 同样可以运行伪目标。而不一定非要
“make 伪目标”这种形式。

强烈推荐陈皓同学的关于makefile入门的宝典级作品:跟我一起写makefile ,连接如下:
http://blog.csdn.net/haoel/archive/2004/02/24/2886.aspx

你可能感兴趣的:(关于Makefile的两个基本问题(参考大作“跟我一起写makefile”))