1、什么是makefile?
- makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作。
- makefile 就是“自动化编译”,告诉make命令如何编译和链接。
2、makefile里有什么?
makefile包含以下五个:
- 显示规则
- 隐晦规则
- 变量定义
- 文件指示
- 注释
3、makefile的规则
target ... : prerequisites ...
command
或者:
target ... : prerequisites... ;command
- target:目标文件。可以是Object File,也可以是执行文件,还可以标签(Label)
- prerequisites:依赖文件,既要生成那个target所需要的文件或其他target
- command:make需要执行的命令
makefile 示例
#当前目录存在main.c tool.c tool.h三个文件
#下面是makefile文件内容
main: main.o too.o
gcc main.o tool.o -o main
.PHONY: clean
clean:
-rm main *.o
----------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
- -o:指定可执行文件的名称。
- clean:标签,不会生成“clean”文件,这样的target称之为伪目标,伪目标的名字不能和文件的名字重复。clean一般放在文件最后。
- .PHONY:显示的表明clean是一个伪目标。
4、makefile是如何工作的?
默认方式下,输入make命令后:
- make会在当前目录下找名字叫“Makefile”或者“makefile”的文件。
- 如果找到,他会找文件中第一个目标文件(target),并把这个target作为最终的目标文件,如前面实例中的main。
- 如果main文件不存在,或main所依赖的.o文件的修改时间要比main文件要新,那么它会执行后面所定义的命令来生成main文件。
- 如果main所依赖的.o文件也存在,那么make会在当前文件中到目标为.o文件的依赖性,若找到则根据规则生成.o文件。
- make再用.o文件声明make的最终任务,也就是执行文件“main”。
5、makefile中使用变量?
- 为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成c语言中的宏可能更好。
- 比如,我们生成一个变量,叫objects,于是,我们就可以很方便的在我们的makefile中以$(objects)的方式来使用这个变量了。
objects = main.o tool.o
main: $(objects)
gcc $(objects) -o main
.PHONY:clean
clean:
-rm main $(objects)
-------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
6、makefile中如何引用其他的makefile?
- 使用include关键字可以把其它Makefile包含进来,include语法格式:
include <filename>
#语法格式
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>
7、环境变量 MAKEFILES
- 如果当前环境变量中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于 include 的动作。这个变量中的值是其它 Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的 makefile 的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的makefile都会受到它的影响,也许有时候makefile出现了奇怪的事,那么可以查看当前环境中有没有定义这个变量。
8、makefile预定义变量
9、makefile自动变量
9、makefile函数
#不带参数
define FUNC
$(info echo "hello")
endif
$(call FUNC)
-----------------------------
输出:hello
#带参数
define FUNC1
$(info echo $(1) $(2))
endif
$(call FUNC1,hello,world)
-----------------------------
输出:hello world
10、make的工作流程
GNU的make工作时的执行步骤如下:
- 1 读入所有的Makefile。
- 2 读入被include的其他Makefile。
- 3 初始化文件中的变量。
- 4 推到隐晦规则,并分析所有规划。
- 5 为所有的目标文件创建依赖关系链。
- 6 根据依赖关系,决定哪些目标要重新生成。
- 7 执行生成命令