Makefile
语法规则:
targets : prerequisites
command
targets
也就是一个目标文件,可以是 Object File,也可以是可执行文件,还可以是一个标签(伪目标)。prerequisites
就是,要生成的那个target所需要的文件或是目标。command
也就是 make 需要执行的命令(任意的shell命令)。
# 指定 Makefile
-f 或 –file 或 –makefile
make -f subdir/hchen.mk
make --file subdir/hchen.mk
make --makefile subdir/hchen.mk
# 嵌套执行 make
-C
subsystem:
$(MAKE) -C subdir
# 变量传递
传递
export <variable ……>
如果不想传
unexport <variable ……>
如果下层Makefile中此变量有定义,那么以下层为准。
# shell 与 ``
PWD := $(shell pwd)
等价于
PWD :=`pwd`
# = 与 := 与 ?=
=
赋值,有一个特点,如下
B=${A}
A=123
A的值定义在了后面,但是B照样能推导出A的值。这样有好也有坏
B=${A}
A=${B}
上面这样就会让make陷入无限的变量展开过程中,当前,make有能力检测到这种定义,并会报错。
:=
为了避免上面这种问题,可以使用 :=
来定义变量。
这种方法,前面的变量不能使用后面的变量,只能使用前面已经定义好的变量。
?=
FOO ?= bar
其含义是,如果FOO没有被定义过,那么在这里定义;如果FOO之前被定义过,那么这条语句将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
# 细节:
如果 # 以tab开头,Makefile不会执行,但是会回显到终端上 如果# 在行首的话,Makefile不会有任何动作;等价于@#以tab开头