标题编译原理和语法详解
什么是Makefile
- makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接操作。
- makefile就是“自动化编译",告诉make命令如何编译和链接。make命令的配置脚本
Makefile里面有什么
makefile包含以下五个:
- 显示规则:如何生成一个或多个目标文件
- 隐晦规则:make有自动推导功能,隐晦规则可以比较简略的书写makefile
- 变量定义:定义一些列字符串的变量,类似于C中的宏,makefile执行时,其中的变量都会被扩展到相应的引用位置上。
- 文件指示:在一个makefile中引用另一个makefile(类似C中的include)、根据某些情况制定makefile中的有效部分(C语言中的预编译)、定义一个多行的命令
- 注释:只有行注释使用‘#’,如果要使用‘#’则需要使用反斜杠 ‘#’表示。
Makefile的规则
-
target:目标文件。可以是Object File,也可以是执行文件,还可以是标签(Label)
-
prerequisties: 依赖文件即要生成那个target所需要的文件或者其它target
-
command:make需要执行的命令
target … : prerequisites …
command
或者
target … : prerequisites … ;command
Makefile示例
Makefile是如何工作的
默认方式下,输入make命令后:
- make会在当前目录下找名字叫”Makefile“或”makefile“的文件。
- 如果找到,它会找文件中第一个目标文件(target),并把这个target作为最终的目标文件,如前面示例中的”main“。
- 如果main文件不存在,或main所依赖的.o文件的修改时间要比main文件要新,那么它会执行后面所定义的命令来生成main文件。
- 如果main所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,若找到则根据规则生成.o文件。
- make再用.o文件声明make的终极任务,也就是执行文件”main“。
Makefile中使用变量
引用其它的Makefile
环境变量MAKEFILES
如果当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的Makefile的”目标“不会起作用,如果环境变量中定义的文件发现错误,make也不会理会。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的Makefile都会受到它的影响。也许有时候Makefile出现了奇怪的事,那么可以查看当前环境中有没有定义这个变量。
Makefile预定义变量
Makefile自动变量
Makefile函数
make的工作流程
GUN的make工作时的执行步骤如下
1. 读入所有的Makefile。
2. 读入被include的其它Makefile。
3. 初始化文件中的变量。
4. 推导隐晦规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7. 执行并生成命令。