Makefile学习笔记3
为规则书写命令
规则命令通常就是由一些shell命令组成,他们被一条一条执行.规则中除了第一条紧跟在依赖列表之后使用分好隔开的命令之外,其他的每一条命令行必须以[Tab]字符开始.
命令回显
make执行命令前会把命令回显到标准输出.如果规则以”@”字符开始,make执行这个命令的时候就不会回显这个要执行的命令.
all:test
echo "开始编译all"
test:
@echo "开始编译test"
//执行结果
$ make
开始编译test //规则命令前加了'@'字符,命令没有回显
echo "开始编译all"
开始编译all
make加了’-n’选项执行时,会回显所有的的命令
make加’-s’选项执行时,禁止所有执行的命令显示,就好像所有的命令前面都加了’@’字符一样.
命令的执行
命令的每一行将在一个独立的shell中执行.因此多个命令之间的执行是相互独立的,相互之间不存在依赖关系,make中同一行的多个命令属于一个完整的shell命令行。
因此,命令行“cd”改变目录不会对气候的命令的执行产生影响。就是说气候的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的,就不能吧“cd”和其后的命令放在两行来书写。而应该把这两条命令写在一行上,用分号分隔。这样它们才是一个完整的shell命令行。
foo : bar/lose
cd bar; gobble lose > ../foo
如果命令要卸载多行上,需要使用饭斜杠(\)来对处于多行命令进行连接,表示它们是一个完整的shell命令行。例如上面我们可以这么写:
foo: bar/lose
cd bar; \
gobble lose > ../foo
并发执行命令
make的’-j’选项用来实现并发执行。
make的递归执行
make递归执行是只,在makefile的规则命令中使用make来执行另一个makefile文件,比如在多级目录的项目中。例如一个目录存在一个子目录”subdir”。在这个子目录中有描述此目录编译规则的makefile文件,在执行make时需要从上层目录开始并完成他的所有子目录的编译。
subsystem:
cd subdir && $(MAKE)
等价于:
subsystem:
$(MAKE) -C subdir
变量 MAKE
变量 CURDIR //这个每递归进入子目录中时会变化,值为当前目录的完整路径
变量 MAKEFLAGS
变量和递归
export 上层变量导入到下层makefile中
取消导入,用unexport命令
不带参数的export,表示导入所有变量
定义命令包
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endif
命令包跟变量的行为相同,可以当作变量来使用。
foo.c: foo.y
$(run-yacc)
空命令
target:;
为来防止查找隐含规则陷入死循环