Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736465
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-04-01 17:40:44

每个目标里都可以运行shell命令,每个命令前以[Tab]开头,它不能是空格。
通常情况下,你执行的命令会在输出中显示出来,比如:
output:
    echo hello
运行make会有如下结果:
$ make output
echo hello
hello

有时我们不希望把执行的命令显示出来,我们可以在命令前加上@符来隐藏这个命令
output:
    @echo hello
$ make output
hello

make命令本身也带有选项来隐藏所有命令的输出,它是-s或--silent。与它相反的是-n或--just-print,它们只显示命令却不执行它们


注意makefile里的命令是一行一行执行的,而且各行命令之间没有瓜葛。比如你在某行cd一个目录,下一行的命令不会受这个cd命令的影响:
testcd:
    cd src1
    pwd

$ make testcd
cd src1
pwd
/home/tommy/makefile

为了关联两个命令,我们需要用;号或&&号把它们连接成一行
testcd:
    cd src1;pwd
    cd src1 && pwd
$ make testcd
cd src1;pwd
/home/tommy/makefile/src1
cd src1 && pwd
/home/tommy/makefile/src1

你应该能猜到;与&&的区别。分号不管什么情况都会执行被连接的两个命令,而&&只会在第一个成功的情况下才会执行后一个。举个例子:

testcd:
    cd notexist ; pwd
    -cd notexist && pwd

$ make testcd
cd notexist ; pwd
cd: 1: can't cd to notexist
/home/tommy/makefile
cd notexist && pwd
cd: 1: can't cd to notexist
make: [testcd] 错误 2 (忽略)

可以看到第一行里的pwd继续执行而第二行的没有。注意第二行的cd命令前有一个-号,它是为了使make忽略出错的命令,否则make在执行命令出错时会中断退出。第一行之所以不需要-号的原因,是因为该行的返回值由该行最后一个命令的返回值决定。由于第一行pwd返回成功,所以这行也视为成功。

我们也可以使用.IGNORE声明来忽略一个目标里的所以错误。
.IGNORE: testcd
testcd:
    cd notexist ; pwd
    cd notexist && pwd

make有相应的忽略所有错误的选项-i或--ignore-errors。另一个选项是-k或--keep-going,它表示如果命令错,那么中断当前的目标,但是继续执行别的目标。


我们可以把make分成多个子系统,比如在子文件夹下放入别的makefile,然后用入下命令执行:
subsystem:
    cd subdir && $(MAKE) -w
它等价于:
subsystem:
    $(MAKE) -C subdir

-w或--print-directory选项会打印当前makefile的目录,它的输出为:

$ make subsystem
cd subdir && make -w
make[1]: 正在进入目录 `/home/tommy/subdir'
I'm sub system!
make[1]:正在离开目录 `/home/tommy/subdir'

使用-C选项时,-w选项被被自动打开。如果-s被指定了,那么-w选项会失效。当然,你可以根据需要指定合适的make选项。

我们要以把变量传递给子系统,通过export关键字。

比如:
var=val (或var:=val)
export var
等价于
export var=val(或var:=val)

同样,
var+=val
export var
等价于
export var+=val

如果有一行单独的export语句,那么所有的变量(在export之前和之后的)都会被传递给子系统。

unexport 可以取消一个变量的传递。也可以单独使用取消传递所有的变量。


我们可以用define和endef把多个命令语句组合在一起,来重复使用。它被称为定义包。这类似于函数:
define print-info
    @echo "1--" $@
    @echo "2--" $@
endef

info-one:
    $(print-info)

info-two:
    $(print-info)
输出的结果为:
$ make info-one info-two
1-- info-one
2-- info-one
1-- info-two
2-- info-two
阅读(2327) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~