1.makefile的内容
一个完整的makefile包含5个东西:
显示规则,隐含规则,变量定义,指示符,注释
(1)显示规则
描述如何更新目标文件。
(2)隐含规则
make程序内置的规则。
make根据目标文件名(后缀)推导出依赖文件,并使用默认的命令对目标进行更新
(3)变量定义
使用一个字符或字符串代表一个文本串
(4)指示符
指明make读取makefile文件时,要执行的动作。
【1】读取一个文件,如 -f
【2】处理或忽略makefile中特定部分,如 条件执行(ifeq, ifneq, ifdef, ifndef)
【3】定义一个多行变量,如 define
(5)注释
用 #,连接符 \
2. 指定首个makefile文件
make默认读取本目录的makefile文件。
使用 make -f xxx, 来显示指定。
3.包含其他makefile文件
使用指示符 include
include FILENAMES...
include指示符命令make暂停当前makefile文件读取,去读取include指定的文件,完成后,继续读取当前makefile文件。
如果include 指定的文件,不是用绝对路径描述,则make会在命令行参数 -I 或 --include-dir 指定的目录查找该文件,若没找到则在 /usr/gnu/include /usr/local/include /usr/include 中查找
若依旧没找到include指定的文件,make不会退出,只会报警告。当解析阶段结束,进入运行阶段,make会尝试使用规则创建该文件,若无法创建,则会报错退出。
Make: *** No rule to make target ‘<filename>’. Stop
若不希望因为无法加载或创建文件导致报错,可以使用 -include 或 sinclude。
4.MAKEFILES
若设置了 MAKEFILES 环境变量,make会先读取该变量指定的makefile文件。
5.MAKEFILE_LIST
当make读取了多个makefile文件,在对这些文件进行执行前,会将其名字追加到 MAKEFILE_LIST 。
可以这样使用
name1 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) include inc.mk name2 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) all: @echo name1 = $(name1) @echo name2 = $(name2)
运行结果
name1 = Makefile
name2 = inc.mk
6.
7.
8.
9.make如何解析makefile文件
GNUmake执行分为两阶段
第一阶段(解析):读取所有makefile文件,构建目标依赖关系树。
第二阶段(运行):根据关系树和时间戳,使用规则,更新过期了的目标。
10.总结
make的执行过程如下:
(1)读取所有makefile文件(通过MAKEFILES环境变量,-f命令行参数,include指示符确定makefile文件)
(2)查找重建所有已读取makefile文件的规则。
(3)初始化并展开立即展开变量和函数,并根据条件判断确定执行分支
(4)根据终极目标和目标依赖关系建立关系树
(5)根据时间戳和依赖关系树更新过期的目标
《GNU_Makefile》——第3章,Makefile总述
原文:https://www.cnblogs.com/yangxinrui/p/12882319.html