前言
自动化构建工具是干什么的呢? 主要是为了让我们对指令进行一些设置,就比如说,假如一个项目里有很多个源文件,这些源文件哪些需要先编译,哪些又需要同时进行编译,等等,如果这种情况下我们输入一条指令一条指令的进行编译,效率无疑会慢很多。而 自动化构建工具,只需要我们在设置好指令后,输入特定的指令,就会实现自动编译,会极大的提高开发效率。
了解完背景,我们来谈一谈make与Makefile
make与Makefile
make是一个指令,Makefile则是一个文件,是由我们用户自己创建,当然也可以写成 makefile, 而make指令的使用,则需要我们在Makefile文件中将任务进行编写。那么如何在Makefile文件中编写任务呢?
Makefile的使用
我们任务的编写,主要依靠两个东西,一个为依赖关系,一个为依赖方法。
依赖关系
这里简单举个例子,假如我想要对一个test.c源文件进行编译,最终生成一个mytest的可执行程序,那么我们就可以说mytest与test.c互为依赖关系。mytest的生成需要依赖test.c这个源文件。两者之间用冒号:进行连接。(我们的依赖关系可以为n个,n>=0)
依赖方法
依赖方法就是这个mytest是如何从test.c转变过来的,如下图:
编写完成后,我们只需要输入make mytest这条指令,就会实现自动编译。
这里有一点需要注意,就是当这个自动化任务执行完后,假如这个文件的相关属性没有发生改变(比如说对内容进行修改等),那么我们再次执行自动化任务则会报错。
关于make
我们在上面演示了make mytest 实现自动编译,但是我们发现,即使我们输入make这个指令,也依然可以实现自动编译,这是为什么呢?
因为make默认执行第一组任务,我们把依赖关系+依赖方法两者看成一个组,而make命令只会执行第一组的自动化任务。(注意,必须是依赖关系+依赖方法才能够成一个完整的自动化构建任务)
当然,一组任务里的依赖方法也可以不仅仅只有一个。
.PHONY
我们上面已经说了,假如文件最近的属性没有发生改变(这里主要是指文件的最近修改时间),我们再次执行make指令,会发生报错,我们的解决方法是我们打开这个文件,不做修改再保存并退出来,就可以再次使用make指令,这是因为文件的最近修改时间属性被我们更新了。那么有没有别的方法呢?
有的,就是利用 .PHONY,.PHONY是Makefile中的一个关键字: 对某对象生成伪目标,它的作用 就是可以使我们在不对文件的属性进行修改的情况下,任意使用make指令。
使用方法
用起来也很简单,在任务的上方用.PHONY对我们的文件进行修饰一下即可,如下:
实战练习:多文件的同时编译
是不是会方便很多,假如项目特别多的话,我们只需要按照要求,将任务写好,然后便可以实现自动化构建,会大大增加效率。