1 make执行分为两个阶段

第一个阶段:读makefile并且建树阶段

第二个阶段:构建目标阶段

2 扩展的立即和推迟

在第一个阶段的扩展是立即,在第二个阶段或者在需要的时候再扩展是推迟,这里的需要的时候不光是第二个阶段,也可能在第一个阶段,比如在条件判断里面用了推迟扩展的变量,那么还是会立即扩展的。

3 立即扩展的场景

扩展的不光包括变量的扩展,也包括函数的执行的扩展。

3.1 ":="形式的赋值是立即扩展

3.2 规则的目标和依赖都是立即扩展的

3.3 +=

如果前面是立即扩展的变量,那么它也是立即扩展的。

3.4 条件判断中的变量是立即的

条件语句是在读取makefile的阶段进行处理的,即第一个阶段处理的。所以,条件判断中的变量是立即扩展的。

 

4 推迟扩展的场景

4.1 “=”

4.2 规则的命令是推出扩展的

也就是说,直到命令被触发执行的时候才进行扩展。

4.3 +=

如果前面的变量是推迟扩展的,那么它也是推迟扩展的。

4.4 自动变量是推迟扩展的

自动变量直到规则的命令执行的时候才会扩展。

4.5

 

5 关于函数扩展的时机

函数的执行也是立即进行的,在读取makefile的时候就会执行,除了在等号的右边,在命令中,或者在define体中。