版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengfei240/article/details/53725843
命令回显
- makefile 在执行命令行之前会把要执行的命令行输出到标准输出设备上
- 如果命令行以字符“@”开始,则禁止该条命令的回显
- 如果使用参数“-s”或“–slient,则禁止所有命令的回显
- 可以使用“.SILENT”禁止指定目标规则的命令回显
- 如果使用参数“-n”或“–just-print”,那么只显示所要执行的命令,但不会真正的去执行
命令的执行
- 每一个命令行将在一个独立的进程中被执行,多行命令之间是相互独立的,不存在依赖
- 书写在同一行中的多个命令属于一个命令行
- makefile 对所有规则命令的解析使用环境变量“SHELL”所指定的那个程序,但该值并不使用系统环境变量中的定义,其默认程序是“/bin/sh”
并发执行命令
- 可以通过命令行选项“-j N”或者“–job N”指定命令行执行的并发数
- 可以通过命令行选项“-k”或者“–keep-going”指定在错误之后尽可能继续执行
- 可以通过命令行选项“-l float”或“–max-load float”限制当前运行的任务所需要占用的系统负载
命令执行错误
- 可以通过“-”忽略命令执行失败,比如 -rm *
- 可以通过命令行选项“-i”或者“-ignore-errors”忽略所有命令的执行失败
- 可以使用“.IGNORE”指定忽略某些目标规则的命令的执行失败
在 makefile 执行失败时,建议修改错误之后首先使用 make clean 明确的删除前一次生成的目标文件。
中断执行
- makefile 在执行命令时如果收到一个致命信号(终止 make),那么 makefile 将会删除此命令中已经重建的目标文件
- 可以使用“.PRECIOUS”来取消该动作
递归执行
递归执行:指在 Makefile 中使用“make”作为一个命令来执行本身或者其它 makefile 文件的过程。
示例:
subsystem:
cd subdir && $(MAKE)
等价于
subsystem:
$(MAKE) -C subdir
变量MAKE
- 变量“MAKE”的值是“make”
- 可以保证最顶层和底层使用同一个 make 程序进行解析
- 在规则的命令行中如果使用变量“MAKE”,标志“-t”、“-n”和“-q”在这个命令的执行中不起作用
- makefile 的命令行选项被变量“MAKEFLAGS”传递给子 make
- 变量“CURDIR”代表 make 的工作目录
变量和递归
- 父 make 可以明确指定将一些变量的定义通过环境变量的方式传递给子 make 过程,格式如下:(这些变量会被立即展开)
export # 所有变量传递给子makefile
export VARIABLE ... # 变量variable传递给子makefile
unexport VARIABLE ... # 变量variable不传递给子makefile
- 如果没有明确指定,父 makefile 不会将其变量传递给子 makefile
- 使用环境变量传递父 makefile 所定义的变量时,不会覆盖子 makefile的同名变量。除非使用“-e”选项
- 特殊的变量“SHELL”和“MAKEFLAGS”它们在整个执行过程中始终被自动的传递给子 makefile
- 在 Makefile 中,最后一个出现的指示符“export”或者“unexport”决定变量是否向子层传递
命令包
用于定义多个规则都可以使用的一组命令集合,与C语言中宏的使用方式一样,格式如下:
define package-name
command1
command2
endef
命令包是使用一个变量来表示的,当在规则的命令行中使用这个变量时,命令包所定义的命令体就会按照递归展开式变量的方式进行替换,即:
1. 在变量定义时,变量值中对其他变量的引用不会被替换展开
2. 当该命令包需要被展开时(使用后展开),它所引用的其它变量才会被一同替换展开
空命令
一个什么也不做的规则,格式如下:
target: ;
使用空命令的原因是:防止 makefile 在执行时试图为重建这个目标去查找隐含命令。