Makefile
makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作。
makefile 就是“自动化编译”, 告诉make命令如何编译和链接。
make 命令会在当前目录寻找 makefile文件
makefile包含以下五个内容:
显示规则
隐晦规则
变量定义:类似于宏
文件指示: 引入其他makefile, 指定makefile有效部分, 定义多行命令
注释: # 注释
makefile 的规则
target: 目标文件,可以是 ObjectFile,也可以是执行文件,还可以是标签 lable
prerequisites:依赖文件,即生成 target 所需要的文件或其他 target
command:make 需要执行的命令
文件的依赖关系以及如何生成目标文件
makefile 示例
# 当前目录存在 main. c tool.c tool.h 三个文件
#以下是makefile文件内容
main: main.o tool.o
gcc main.o tool.o -0 main (前面是tab键)
.PHONY: clean
clean:
-rm main *.o
// 执行 make 后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
gcc main.o tool.o -o main
// 并且生成一个可执行文件main
clean: 标签,不会生成 clean 文件,这样的target 称之为“伪目标”,伪目标的名字不能和文件名重复,clean一般放在文件最后
.PHONY: 显示的指明clean 是一个 “伪目标”
make file 是如何工作的:
默认方式下,输入make命令后:
make 会在当前目录下找名字为 “Makefile” 或 “makefile” 的文件。
如果找到,它会找文件第一个目标文件(target),并把这个target作为最终的目标文件,如前面示例中的main。
如果mian 文件不存在, 或main依赖的 .o 文件的修改时间要比main文件新,那么它会执行后面所定义的命令来生成main文件。
如果main所依赖的.o 文件也存在,那么make 会在当前文件中找目标为 .o文件的依赖性,若找到则根据规则生成.o文件。
make 再用 .o 文件声明make 的终极任务,也就是执行文件 “main”。
makefile中使用变量
objects = main.o tool.o
main: $(objects)
gcc $(objects) -o main
.PHONY: clean
clean:
-rm main $(objects)
为了makefile的易维护, 在makefile中我们可以使用变量。
makefile的变量也就是一个字符串,理解成C语音中的宏。
比如 我们声明一个变量,叫objects, 于是,我们就可以 方便的在makefile中以“$(objects)”的方式使用这个变量。
引用其他的makefile
#语法格式
include<filename>
# 举个例子,有这样几个Makefile a.mk b.mk c.mk 还有个文件叫 foo.make, 以及一各变量$(bar)
其中包含 e.mk 和 f.mk
include foo.make *.mk $(bar)
#等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
#如果文件找不到,而你希望make时不理会那些无法读取的文件而继续执行
#可以在include 前面加一个 减号 “-” 如:
-include <filename>
环境变量MAKEFILES
如果当前环境中定义了环境变量 MAKEFILES,那么 make 会把这个变量中的值做一个类似于include的工作。这个变量中的值是其他的makefile,用空格分割。只是,它和include不同的是,从这个环境中引入的 Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的makefile都会受他影响。
也许有时候Makefile出现了奇怪的事,那么可以查看当前环境中是否定义这个变量。
Makefile预定义变量
makefile自动变量
makefile 函数
不带参数
define FUNC
$(info echo "hello")
endef
$(call FUNC)
----输出 hello
带参数
define FUNC1
$(info echo $(1) $(2))
endef
$(call FUNC1,hello,world)
----
输出:hello world
Make的工作流程
GNU的make工作时的执行步骤如下:
1.读入所有的Makefile
2.读入被include 的其他Makefile
3.初始化文件中的变量。
4.推导隐晦规则,并分析所有规则。
5.为所有的目标文件创建依赖关系链。
6.根据依赖关系,决定哪些目标要重新生成。
7.执行生成命令。