规则的命令
- 通常系统中可能存在多个不同的shell。但在make处理makefile过程中,如果没有明确指定,那么对所有规则中命令行的解析使用“/bin/sh”来完成;
- 命令回显:make在执行命令行之前会把执行的命令行输出到标准输出设备。
- 如果规则的命令行以字符“@”开始,则make在执行这个命令时就不会回显这个将要被执行的命令。典型的用法是在使用“echo”命令输出一些信息时。
如:@echo 开始编译XXX模块
执行时,将会得到“开始编译 XXX 模块…”这条输出信息。如果在命令行之前没有
字符“@”,那么,make 的输出将是:
echo编译XXX模块…
编译XXX模块… - 在一个规则的命令中,命令行“cd”改变目录不会对其后的命令的执行产生影响。就是说其后的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的,就不能把“cd”和其后的命令放在两行来书写。而应该把这两条名写在一行上,用分号分隔。这样它们才是一个完整的shell命令行。
foo : bar/lose
cd bar;gobble lose > ../foo
- 通过make命令行选项“-j”或者“-job”来告诉make在同一时刻可以允许多条命令同时被执行。
- 并行执行命令带来的问题:
a) 多个同时执行的命令的输出信息将同时被输出到终端。当出现错误时很难根据一大堆凌乱的信息来区分是哪条命令执行错误;
b) 在同一个时刻可能存在多个命令执行过程同时读取标准输入,但是对于标准输入设备来说,在同一时刻只能存在一个进程访问它。 - “-l”选项告诉make限制当前运行的任务的数量(make所限制的只是它本身所需要占用的系统负载,而不能通过它去控制其它的任务所占用的系统负载)。
-l 2.5
make当系统平均负荷高于2.5时,不在启动任何执行命令的子任务。不带浮点数的”-l”选项用于取消前面“-l”给定的负荷限制; - 需要将一个在上层定义的变量传递给子make,应该在上层Makefile中使用指示符“export”对此变量进行声明
export VARIABLE…
当不希望将一个变量传递给子make时,可以使用指示符“unexport”来声明这个变量:
unexport VARIABLE…
9. 同时使用“define”定义的一组命令称为一个命令包。定义一个命令包的语法以“define”开始,以“endef”结束,例如:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
“run-yacc”是这个命令包的名字。在“define”和“endef”之间的命令就是命令包的主体。需要说明的是:使用“define”定义的命令包中,命令体中变量和函数的引用不会展开。命令体中所有的内容包括“$”、“(”、“)”等都是变量“run-yacc”的定义。
10. 空命令:
target:;
空命令行可以防止make在执行时试图为重建这个目标去查找隐含命令(包括了使用隐含规则中的命令和“.DEFAULT”)指定的命令。