规则中的recipe由一条或多条shell命令组成, 并会按照顺序执行。

通常,这些命令执行的结果就是更新target

Linux用户可以使用多种不同的shell程序,但Makefile中的recipe是由/bin/sh来解释。

Recipe语法

Makefile最不同寻常的是一个文件中有两种语法。大部分内容都是用的是make语法,但是recipe是由shell来解释的,因此需要使用shell语法编写。

make不需要解释shell语法,只需要将recipe翻译之后传递给shell即可。

recipe的每行都以tab.RECIPEPREFIX变量指定的字符开始。处于规则上文中,并以tab开始的行会被当做规则的recipe。空行或注释行可以出现recipe中,但是会被忽略。

在规则中的recipe有以下方式:

  • tab开头的空行不是空白,而是一个空的recipe
  • recipe中的注释不是make注释,是否是注释需要有执行的shell来决定。
  • 规则上文中的以tab开头的行中的变量定义会被当做recipe的一部分,而不是make变量定义,会被传递给shell
  • 规则上文中的以tab开头的行中的条件表达式(如ifreqifeq)会被当做recipe的一部分,传递给shell

分离recipe

make会检查recipe每行的换行符之间是否有\,如果有\,那么会将其当做单个配方行,并将调用一个shell实例来运行。

all :
    @echo no\
space
    @echo no\
    space
    @echo one \
    space
    @echo one\
     space

# make会将其当做下面四条shell命令
nospace
nospace
one space
one space

配方中使用变量