码迷,mamicode.com
首页 > 其他好文 > 详细

make执行过程

时间:2016-10-07 20:16:51      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

 

转载自 陈皓《跟我一起写 Makefile

 

一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你 有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。

一、make的退出码

make命令执行后有三个退出码:

    0 —— 表示成功执行。
    1 ——
如果make运行时出现任何错误,其返回1
    2 ——
如果你使用了make“-q”选项,并且make使得一些目标不需要更新,那么返回2

二、指定Makefile

前面我们说过,GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件——“GNUmakefile”“makefile”“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。

当前,我们也可以给make命令指定一个特殊名字的 Makefile。要达到这个功能,我们要使用make“-f”或是“--file”参数(“--makefile”参数也行)。例如,我们有个 makefile的名字是“hchen.mk”,那么,我们可以这样来让make来执行这个文件:

    make –f hchen.mk

如果在make的命令行是,你不只一次地使用了“-f”参数,那么,所有指定的makefile将会被连在一起传递给make执行。


三、指定目标

一般来说,make的最终目标是makefile中的第一个目标,而其它目标一般是由这个目标连带出来的。这是make的默认行为。当然,一般来说,你的makefile中的第一个目标是由许多个目标组成,你可以指 make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式)

任何在makefile中的目标都可以被指定成终极目标,但是 除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。甚至没有被我们明确写出来的目标也可以成为make 终极目标,也就是说,只要make可以找到其隐含规则推导规则,那么这个隐含目标同样可以被指定成终极目标。

有一个make的环境变量叫“MAKECMDGOALS”,这个变量中会存放你所指定的终极目标的列表,如果在命令行上,你没有指定目标,那么,这个变量是空值。这个变量可以让你使用在一些比较特殊的情形下。比如下面的例子:

    sources = foo.c bar.c
    ifneq ( $(MAKECMDGOALS),clean)
    include $(sources:.c=.d)
    endif

基于上面的这个例子,只要我们输入的命令不是“make clean”,那么makefile会自动包含“foo.d”“bar.d”这两个makefile

使用指定终极目标的方法可以很方便地让我们编译我们的程序,例如下面这个例子:

    .PHONY: all
    all: prog1 prog2 prog3 prog4

从这个例子中,我们可以看到,这个makefile中有四个需 要编译的程序——“prog1” “prog2” “prog3” “prog4”,我们可以使用“make all”命令来编译所有的目标(如果把all置成第一个目标,那么只需执行“make”),我们也可以使用“make prog2”来单独编译目标“prog2”

即然make可以指定所有makefile中的目标,那么也包 伪目标,于是我们可以根据这种性质来让我们的makefile根据指定的不同的目标来完成不同的事。在Unix世界中,软件发布时,特别是GNU 种开源软件的发布时,其makefile都包含了编译、安装、打包等功能。           我们可以参照这种规则来书写我们的makefile中的目标。

     “all” :这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
     “clean”
:这个伪目标功能是删除所有被make创建的文件。
     “install”
:这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
     “print”
:这个伪目标的功能是例出改变过的源文件。
     “tar”
:这个伪目标功能是把源程序打包备份。也就是一个tar文件。
     “dist”
:这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
     “TAGS”
:这个伪目标功能是更新所有的目标,以备完整地重编译使用。
     “check”
“test” :这两个伪目标一般用来测试makefile
的流程。

当然一个项目的makefile中也不一定要书写这样的目标, 这些东西都是GNU的东西,但是我想,GNU搞出这些东西一定有其可取之处(等你的UNIX下的程序文件一多时你就会发现这些功能很有用了),这里只不过 是说明了,如果你要书写这种功能,最好使用这种名字命名你的目标,这样规范一些,规范的好处就是——不用解释,大家都明白。而且如果你的makefile 中有这些功能,一是很实用,二是可以显得你的makefile很专业(不是那种初学者的作品)。

 

 

make执行过程

标签:

原文地址:http://www.cnblogs.com/AP0904225/p/5936521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!