Makefile学习笔记3

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:;

为来防止查找隐含规则陷入死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值