Make命令与MakeFile的编写学习

Make命令与MakeFile的编写学习

  • [Make 命令](#Make 命令)
    • [make 的运行](#make 的运行)
  • Makefile的格式
    • [目标 target](#目标 target)
    • [前置条件 prerequisites](#前置条件 prerequisites)

参考:
跟我一起写Makefile
阮一峰的网络日志 Make 命令教程

Make 命令

GUN 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:这个伪目标功能是安装 已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
print:这个伪目标的功能是例出改变过的源文件。
tar:这个伪目标功能是把源程序打包备份。也就是一个tar文件。
dist:这个伪目标功能是创建一个压缩 文件,一般是把tar文件压成Z文件。或是gz文件。
TAGS:这个伪目标功能是更新所有的目标,以备完整地重编译使用。
checktest:这两个伪目标一般用来测试makefile的流程。

前置条件 prerequisites

前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。

相关推荐
华清远见成都中心2 分钟前
物联网学习路线来啦!
物联网·学习
hgy89699 分钟前
Ekman理论回归
学习
坚硬果壳_27 分钟前
《硬件架构的艺术》笔记(一):亚稳态
笔记·学习
BT-BOX42 分钟前
STM32仿真proteus位带操作和keil增加头文件C文件
c语言·stm32·proteus
醉颜凉1 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
糊涂君-Q1 小时前
Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
python·学习·程序人生·考研·职场和发展·学习方法·改行学it
qiyi.sky1 小时前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
dal118网工任子仪1 小时前
web安全漏洞之ssrf入门
笔记·学习·计算机网络·网络安全
键盘敲没电1 小时前
【iOS】知乎日报前三周总结
学习·ios·objective-c·xcode
Lyqfor2 小时前
云原生学习
java·分布式·学习·阿里云·云原生