编写Recipe
规则中的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开头的行中的条件表达式(如ifreq和ifeq)会被当做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
配方中使用变量
- 原文作者:生如夏花
- 原文链接:https://DBL2017.github.io/post/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7/makefile/%E7%BC%96%E5%86%99recipe/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。