变量的赋值
- =
经过递归扩展的变量 - :=
经过简单扩展的变量 - +=
追加运算符 - ?=
附带条件的变量
变量扩展规则
2个阶段
1.make会读进makefile以及被引入的任何其他makefile,这时变量和规则都会被加载进入make的内部数据库,建立依存图
2.make会分析依存图并且判断需要跟新的工作目标然后执行脚本已完成所需要的更新动作。
下面例子
$(OUTPUT_DIR)/very_big_file
会被立即扩展,因为工作目标和必要条件中所用到的变量会被立即扩展,接着make继续读取makefile,$(free-space)
不会被扩展,而是读取并将之存储起来。
宏free-space
会被立即扩展,当然这里不需要扩展,但是宏里面具体内容不会被立即扩展而是存储起来。
接下来BIN、PRINTF、DF、AWK
会被立即扩展,因为他们都是简单变量
最后执行make整个规则变成下面这样
变量来源
- 文件
变量可以被定义再makefile文件中,或者是被makefile引入(include) - 命令行
如
注意,如果想要忽略命令行变量,可以再makefile文件定义变量时加上override如,
make时,所有环境变量都自动的被定义成make的变量,但是这些变量比makefile文件或者命令行赋值的变量优先级低,会被覆盖掉,如果不想被覆盖向使用环境变量的话使用-e
命令行选项
条件指令
如
注意,条件指令前不是shell命令,不要有tab键,而ifeq ifneq
只能忽略都好之后的空格,要注意空格问题,可以使用strip
函数
include 指令
一个makefile可以引入其他文件,用include,当没有这个文件时make会汇报问题继续读取剩余makefile,当读完后找到更新要include文件的规则,找不到就报错(如果想忽略的话就用sinclude),找到的话则清除内部数据库并重新make。
include文件路径问题
如果include的参数时绝对路径则直接读取该文件,如果时相对路径则make先到当前路径查找,找不到的话就到你make命令行-I
选项指定路径目录继续查找。
标准的make变量
- MAKE_VERSION
GNU make的版本号 如3.80 - CURDIR
正在执行make进程的当前工作目录,此变量就是shell中PWD的值 - MAKEFILE_LIST
make所读取的各个makefile文件名称所构成的列表,包括默认的makefile以及命令行或者include指令所指定的makefile,在每个makefile被读进make之前,其文件名都会被追加到MAKEFILE_LIST变量里,所以任何makefile查看此变量最后一项就是自己的文件名