Linux初始——自动化构建
make与makefile
- 概念
- PHONY的实现方式
- ACM时间详细解释
- makefile的语法
- makefile杂谈
概念
make
是一个指令,makefile是一个文件,make是执行makefile的指令。
make是帮助进行自动化构建的指令。
makefile中一般写如下内容
myproc:myproc.cgcc -o myproc myproc.c
.PHONY:clean
clean:rm -f myproc
myproc:myproc.c代表依赖关系,gcc -o myproc myproc.c代表依赖方法,.PHONY表示总是被执行。
make所推导的就类似与栈或者函数递归。
- 依赖关系必须存在,依赖文件列表可以为空
- 依赖方法可以是任何shell命令
- clean目标,只是利用make的自动推导的能力让他执行了rm命令,在构建工程的视角,看起来就是清理项目清理项目,本质就是删除不需要的临建文件!
- make命令,后面可以跟“目标名后面跟谁,就解析谁的依赖关系和依赖方法
- make默认只会推导一条完整的推导链路!
- make默认只会推导第一个依赖关系对应的推导链!
PHONY的实现方式
首先我们最终形成的可执行程序是不被PHONY修饰的,只有这样才会让没有被修改的源文件不被重新编译。而clean是需要每次都执行的。
我们通过命令stat test.c
可以看见该文件的三个时间,分别是
Modify: 内容变更,时间更新
Change:属性变更,时间更新
Access:常指的是文件最近一次被访问的时间
而源文件是否需要被重新编译,是查看源文件和可执行程序的修改时间谁更新,只有当源文件的修改时间比可执行程序的修改时间要新就可以重新编译。
当touch test.c
时,对于一个已存在的文件,touch会修改时间。
那么PHONY的实现方式就是让编译器忽略时间,直接执行
ACM时间详细解释
我们已经知道,更改Change对应的是属性,比如改变其读属性,Change就会变化而Modify不会改变,但当我们更改文件内容时,MC时间均发生变化,原因是更改文件内容,文件大小也会随之更改,文件大小也是属于文件属性的。Access是最近被访问的时间,但一般来说并不是访问一次就进行修改,因为访问的次数是非常多的,如果每次访问都更新时间,磁盘效率会降低,所以只有当访问的次数达到一定数量的时候才会更新Access时间。
makefile的语法
可以定义变量例如BIN=test.exe,SRC=test.c
,在后续用$(BIN) : $(SRC)
就可以代替之前的test.exe:test.c
,在依赖方法中,可以使用gcc -o $@ $^
来进行编译, $@
代表目标文件, $ ^
为依赖的文件,如果有多个依赖文件,就可以使用SRC= $(shell ls *.c)
或者 $(wildcard *.c)
, $
不仅可以引用变量,也可以代表系统内置的变量,还可以执行shell命令和内置函数,OBJ= $(SRC:.c=.o)
即将后缀为.c的源文件替换为.o,
%.o:%.c
$(CC) -c $<
为将每一个.o 文件与.c一 一对应进行编译
makefile杂谈
- 通常情况下,make命令会在当前目录下依次寻找GNUmakefile,makefile,Makefile文件。
- makefile还可以通过include将其他makefile文件包含起来。
- Makefile不仅保存编译器和连接器的参数选项,还包含规则、变量等更丰富的内容。
- Makefile的核心要素是规则(显式/隐式)、变量、指令(如include)和注释