Make命令与MakeFile的编写学习
- [Make 命令](#Make 命令)
-
- [make 的运行](#make 的运行)
- Makefile的格式
-
- [目标 target](#目标 target)
- [前置条件 prerequisites](#前置条件 prerequisites)
参考:
跟我一起写Makefile
阮一峰的网络日志 Make 命令教程
Make 命令
Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。
make命令执行后有三个退出码:
0
表示成功执行。
1
如果make运行时出现任何错误,其返回1。
2
如果你使用了make的"-q"选项,并且make使得一些目标不需要更新,那么返回2。
总之,make只是一个根据指定的Shell命令进行构建的工具。它的规则很简单,你规定要构建哪个文件、它依赖哪些源文件,当那些文件有变动时,如何重新构建它
make 的运行
一般来说,最简单的就是直接在命令行下输入make
命令,make
命令会找当前目录的makefile 来执行,一切都是自动的。但也有时你也许只想让make
重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。
GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件------"GNUmakefile"、"makefile"和"Makefile"。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。
当前,我们也可以给make命令指定一个特殊名字的Makefile。要达到这个功能,我们要使用make的 -f 或是 --file 参数( --makefile 参数也行)。例如,我们有个makefile的名字是"myproject.mk",那么,我们可以这样来让make来执行这个文件:
bash
make --f myproject.mk
Makefile的格式
Makefile文件由一系列规则(rules)构成。每条规则的形式如下
powershell
<target> : <prerequisites>
[tab] <commands>
上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。
"目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。
每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建
一般来说,你的makefile中的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成;如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。
目标 target
一个目标(target)就构成一条规则。目标通常是文件名,指明Make命令所要构建的对象,比如上文的 myproject.mk 。目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。
除了文件名,目标还可以是某个操作的名字,这称为**"伪目标"(phony target)。**
powershell
clean:
rm *.o
bash
$ make clean
上面代码的目标是clean,它不是文件名,而是一个操作的名字,属于"伪目标 ",作用是删除对象文件。但是,如果当前目录中,正好有一个文件叫做clean,那么这个命令不会执行。因为Make发现clean文件已经存在,就认为没有必要重新构建了,就不会执行指定的rm命令。
为了避免这种情况,可以明确声明clean是"伪目标",写法如下。
powershell
.PHONY: clean
clean:
rm *.o temp
声明clean是"伪目标"之后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。像.PHONY这样的内置目标名还有不少,可以查看GUN手册。
常用伪目标
all
:这个伪目标是所有目标的目标,其功能一般是编译 所有的目标。
clean
:这个伪目标功能是删除 所有被make创建的文件。
install
:这个伪目标功能是安装 已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
tar
:这个伪目标功能是把源程序打包备份。也就是一个tar文件。
dist
:这个伪目标功能是创建一个压缩 文件,一般是把tar文件压成Z文件。或是gz文件。
TAGS
:这个伪目标功能是更新所有的目标,以备完整地重编译使用。
check
和test
:这两个伪目标一般用来测试makefile的流程。
前置条件 prerequisites
前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。