Makefile入门知识
1.什么是make?
make是工程管理工具,来实现项目的自动化编译。
2.上面既然说了make,接着就来说说Makefile.
2.1 什么是Makefile?
当我们输入make命令后,make工程管理工具会自动识别此目录下的Makefile文件,然后执行Makefile中的规则,这样子就实现了项目的自动化编译。
比如C语言中,只有源文件才会参与编译。当只有某些文件做了修改,那么就重新编译整个项目是一种非常不可取的做法。我们需要一种方式,能帮我们自动判断,哪些文件做了修改,哪些文件修改重新编译,哪些文件需要先编译,哪些文件需要后编译。Makefile就能帮助我们来完成这个任务。Makefile仅仅是一个文件,里边有很多的规则,来说明如何编译,编译的顺序。这里是根据文件更新的时间戳来判断文件的修改时间。
2.2 Makefile必须是Makefile么?
这个问题看起来是句废话,其实不然,上面已经说清楚了,Makefile其实就是一个文件的名字。只不过这个名字是make工程管理工具默认会去读取的文件名字。其实,理解了这一层逻辑就会明白,既然Makefile是make默认读取的文件名字,那么肯定可以不使用默认的名字。那么,下面就来说一说不适用默认文件名字的方法:那就是使用-f选项,在之后添加你指定的编译规则的文件名字(这里的名字肯定是可以随意去取)。就是如下格式:
make -f filename
2.3 Makefile的整体运行逻辑规则
Makefile中的规则有很多,有很多细节上的规则。这里,我们先不说这些细节,先说整体上Makefile的逻辑运行规则。
- 1.先说说什么是Makefile中一条规则?
一条规则一般由以下几个部分组成:
目标:依赖列表
[tab]命令列表
这一条规则的运行逻辑是:为了生成目标文件,首先要依赖于依赖列表中的文件全部存在,依赖列表中文件全部存在的情况下,会执行命令列表中的命令去生成目标文件。 - 2.Makefile中所有规则的运行逻辑?
其中第一条规则中的“目标”,将会成为终极目标。我们的最终目的,就是为了生成这个目标的。 其他的规则之间,没有必然的顺序关系。
例如,在Makefile文件内容如下时:
A:B C D
x命令
B:b1
xx命令
C:c1
xxx命令
D:d1
xxxx命令
A为终极目标,当B C D全部存在时,才会执行x命令去生成终极目标A。当B、C、D中有某一些不存在时,make会去寻找不存在的生成规则,然后执行对应的命令去生成。例如当B、D都不存在时候,make会去寻找B:b1 D:d1这两条规则分别执行xx命令和xxxx命令去生成B和D,最后在B、C、D都生成的情况下,执行x命令,生成终极目标A。至此,这个Makefile的执行过程就完结了。