Makefile 总述
- > Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
-
在Makefile中的命令,必须要以[Tab]键开始。
-
Makefile的文件名:“GNUmakefile”、“makefile”、“Makefile”
-
引用其它的Makefile: includefilename
可以是当前操作系统Shell的文件模式(可以保含路径和通配符)
在include前面可以有一些空字符,但是绝不能是[Tab]键开始。 include和可以用一个或多个空格隔开。
include foo.make *.mk $(bar)
相当于
include foo.make a.mk b.mk c.mk e.mk f.mk
Makefile书写规则
基础概念1
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标
foo.o: foo.c defs.h # foo模块
cc -c -g foo.c
分析:
foo.o是我们的目标,foo.c和defs.h是目标所依赖的源文件
只有一个命令“cc -c -g foo.c”(以Tab键开头)
说明:
1). 文件的依赖关系,foo.o依赖于foo.c和defs.h的文件,如果foo.c和defs.h的文件日期要比foo.o文件日期要新,或是foo.o不存在,那么依赖关系发生。
2). 如果生成(或更新)foo.o文件。也就是那个cc命令,其说明了,如何生成foo.o这个文件。(当然foo.c文件include了defs.h文件)
基础概念2
在规则中使用通配符
“~” 比如“~/test”,这就表示当前用户的$HOME目录下的test目录
“” 比如 通配符代替了你一系列的文件,如“.c”表示所以后缀为c的文件。
Make的工作方式
GNU的make工作时的执行步骤入下:1-5步为第一个阶段,6-7为第二个阶段
读入所有的Makefile。
读入被include的其它Makefile。
初始化文件中的变量。
推导隐晦规则,并分析所有规则。
为所有的目标文件创建依赖关系链。
根据依赖关系,决定哪些目标要重新生成。
执行生成命令。
- 第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。
- 仅当这条依赖被决定要使用了,变量才会在其内部展开。
1. 文件搜寻 把一个路径告诉make,让make在自动去找。
2. 伪目标 -“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行