[004-Makefile-笔记] Makefile规则的命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 在执行时试图为重建这个目标去查找隐含命令。

猜你喜欢

转载自blog.csdn.net/pengfei240/article/details/53725843
今日推荐