make的目标和依赖
makefile的结构
targets : prerequisites
command //注意前面必须是‘\t’制表符,而不是空格
makefile中的元素含义
目标(targets)
通常是需要生成的目标文件名
make所需执行的命令名称
依赖(prerequisities)
当前目标所依赖的其他目标或文件或文件
commad
完成目标所需要执行的命令
all : test //all为make的目标,test为依赖
@echo "make all"
test :
@echo "make test"
赋值符号:
简单赋值(:=):只对当前语句有效,赋值改变的值不会传递
递归赋值(=):一个地方值改变,所有与这个变量相关的值都会变
条件赋值(?=):变量未定义,赋值有效,变量没有定义,赋值无效。
追加赋值(+=):在原变量后面加上一个新的值,用空格隔开
注意:makefile变量的值都属于文本数据,makefile里面用$(变量)来表示变量的值
代码实例:
ex1
# x := foo //定义变量x的值为foo,make里面的变量只有字符串类型
# y := $(x)b //$(x)表示变量的值
# x := new //运行之后的 y = foob ; x = new
# ex2
# x = foo
# y = $(x)b
# x = new //运行之后的 y = newb ; x = new
# ex3
# x := foo
# y := $(x)b
# x ?= new //?=因为前面已经赋值,所以无效
//运行之后的 y = foob ; x = foo
# ex4
# x := foo
# y := $(x)b
# x += new
//运行之后的 y = foob ; x = foo new
常用的预定义变量:
自动变量:
$@ : 当前规则中触发命令执行的目标
$^ : 当前规则中的所有依赖
$< : 当前规则中的第一条依赖
特殊变量:
$() : 括号里面大写基本上都是make自带的一些特殊变量,详细的可查make官网帮助文档
代码实例:
.PHONY : all first second third
all : first second third
@echo "\$$@ => $@" #打印all
@echo "$$^ => $^" #打印first second third
@echo "$$< => $<" #打印first
firtst:
second:
third:
.PHONY : all out first second third test
all out :
@echo "$(MAKE)" #打印当前make解释器的文件名
@echo "$(MAKECMDGOALS)" #打印命令行中指定的目标名(make的命令行参数)
@echo "$(MAKEFILE_LIST)" #make所需要处理的makefile文件列表,当前make文件总是处于列表最后,文件名之间以空格分隔
first :
@echo "first"
second :
@echo "second"
third :
@echo "third"
test :
@$(MAKE) first
@$(MAKE) second
@$(MAKE) third
.PHONY : test1 test2
TDelphi := Delphi Tang
D.T.Software := D.T.
test1 :
@echo "$(MAKE_VERSION)" #当前make解释器的版本
@echo "$(CURDIR)" #当前make解释器的工作目录
@echo "$(.VARIABLES)" #所有已定义的变量(预定义变量和自定义变量)
test2 :
@echo "$(RM)"
环境变量(全局变量):
makefile里面可以直接使用环境变量作为全局变量,当定义了同名变量时,环境变量将会被覆盖。可以在运行make时指定"-e"选项,优先使用环境变量。也可使用export在makefile里面定义临时环境变量
环境变量在所有makefile文件里使用,但会影响移植性。
JAVA_HOME := java home
export var := D.T.Software
new := TDelphi
test :
@echo "JAVA_HOME => $(JAVA_HOME)" #使用make -e运行是为环境变量
@echo "make another file ..."
@$(MAKE) -f makefile.2 #makefile.2的new没有输出,因为new不是全局表量
@$(MAKE) -f makefile.2 new:=$(new) #new输出TDelphi,运用的是命令行定义的技巧
#makefile.2
test:
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "var => $(var)"
@echo "new => $(new)"
目标变量/模式变量:
只作用于指定目标和连带规则里
var := D.T.Software
new := TDelphi
test : var := test-var //定义目标变量,在这个目标和连带的规则里都为目标变量
%e : override new := test-new
test : another #
@echo "test :"
@echo "var => $(var)"
@echo "new => $(new)"
another :
@echo "another :"
@echo "var => $(var)"
@echo "new => $(new)"
rule : # %e : override new := test-new 起作用,%e模式是最后一个字母为e的变量
@echo "rule :"
@echo "var => $(var)"
@echo "new => $(new)"