make执行分两个步骤:
首先它读入所有的makefiles, included makefiles,然后展开内部变量值,并构建所有的目标与依赖之间的联系。
第二步就是根据展开的这个结构来决定哪些目标需要重建,并执行相应的规则。
immediate expansion指的是在第一步就进行的赋值或规则执行,deferred expansion指的是在immediate 上下文中稍后执行的或者等到第二个步骤再执行的扩展。
分类如下:
immediate = deferred
immediate ?= deferred
immediate := immediate
immediate ::= immediate
immediate += deferred or immediate (如果这个变量之前是通过':='或'::=',则为immediate,否则为deferred)
immediate != immediate
immediate : immediate ; deferred
deferred