语法规则:

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开头