- 每条命令的开头必须以[Tab]键开头,除非是紧跟在依赖规则后面的分号后的。
- 在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以 Tab 键开头的,那么 make 会认为其是一个空命令。
- make 的命令默认是被 “/bin/sh”,UNIX 的标准 Shell 解释执行的,除非特别指定一个其它的 Shell 。
- makefile 中,“#” 是注释符,其后的本行字符都被注释。
显示命令
- make 会把其要执行的命令行在命令执行前输出到屏幕上,用“@”字符在命令行前,这个命令将不被 make 显示出来。
- make 带参数 “-n” 或 “–just-print”,只是显示命令,但不会执行命令,可用于调试。
- make 带参数 “-s” 或 “–slient” 则是全面禁止命令的显示。
命令执行
- 如果要让上一条命令的结果应用在下一条命令时,应该使用分号分隔这两条命令,不能把这两条命令写在两行上,否则将不起作用,与预想有差异。
- make 一般是使用环境变量 SHELL 中所定义的系统 Shell 来执行命令,默认情况下使用UNIX 的标准 Shell “/bin/sh” 来执行命令。
命令出错
每当命令运行完后,make 会检测每个命令的返回码,如果成功,make 会执行下一条命令,直到规则成功完成,如果出错,make 就会终止执行当前规 则,这将有可能终止所有规则的执行,但有时候命令的出错并不表示就是错误的。
- 在makefile 的命令行前加一个减号 “-” (在 Tab 键之后),标记为不管命令是否出错都认为是成功的。
- make 带上“-i” 或是 “–ignore-errors” 参数,makefile 中所有命令都会忽略错误。
- 如果一个规则是以 “.IGNORE” 作为目标的,那么这个规则中的所有命令将会忽略错误。
- make 带参数 “-k” 或 “–keep-going”, 那么某规则中的命令出错了,就终止该规则的执行,但继续执行其它规则。
嵌套 make
不同模块或是不同功能的源文件放在不同的目录中, 在每个目录中都书写一个该目录的 makefile,然后总控 makefile 嵌套执行,这有利于模块编译和分段编译。
- 总控 makefile 的变量可以传递到下级的 makefile 中(显示声明),不会覆盖下层的 makefile 中所定义的变量( 除非指定了 “-e” 参数)。
export variable = value #声明传递变量到下级
unexport variable = value #声明不要传递变量到下级
export #传递所有变量
- 两个变量SHELL、MAKEFLAGS 不管是否 export,其总是要传递到下层 makefile 中。上级定义了 MAKEFLAGS, 其包含了 make 的参数信息,是一个系统级的环境变量,如果不想往下传递,可以让MAKEFLAGS=,否则谨慎定义。
- make 命令中的有几个参数并不往下传递,它们是 “-C”,“-f”,“-h”,“-o”,“-W”。
- make 带上参数 “-w” 或 “–print-directory”,会在执行过程中输出目前的工作目录。当使用 “-C” 参数来指定 make 下层 makefile 时,“-w” 会被自动打开,如果参数中有 “-s”(“–slient”)或 “–no-print-directory”,则 “-w” 总是失效的。
定义命令包
如果 makefile 中出现一些相同命令序列,那么可以为这些相同的命令序列定义成一个变量(相当于宏),变量名就是这个命令包的名字,定义这种命令序列的语法以 “define” 开始,以 “endef” 结束。
define test
#命令序列
endef
$(test) #调用命令包变量(变量名不得与其它变量名重复)
make 在执行命令包时,命令包中的每个命令会被 依次独立执行。