关于makefile(2)

忽略命令的出错,我们可以在Makefile的命令行前加一个减号"-"(在TAB键之后),标记为不管命令出错还是不出错都认为是成功的.

如:

clean:

   -rm -f *.o

一 变量的基础

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上"$"符号,但最好用小括号"()"或是大括号"{}",把变量给包括起来.如果你要使用真实的"$"字符,那么你需要用"$$"来表示.

变量可以使用在许多地方,如规则中的"目标","依赖","命令"以及新的变量中.先看一个例子:

objects = program.o foo.o utils.o 

program : $(objects)

cc -o program $(objects)

$(objects) : defs.h

对于系统变量"MAKELEVEL",其意思是,如果我们的make有一个嵌套执行的动作,那么这个变量会记录了我们的当前Makefile的调用层数.

如果我们要定义一个变量,其值是一个空格,那么我们可以这样来:

nullstring :=

space := $(nullstring) #end of the line

nullstring 是一个empty变量,其中什么也没有,而我们的space的值是一个空格.因为在操作符的右边是很难描述一个空格的,这里采用的技术很管用的,先用一个Empty变量来标明变量的值开始了,而后采用"#"注释符来表示变量定义的终止,这样我们可以定义出其值是一个空格的变量.

请注意这里关于"#"的使用,注释符"#"的这种特性值得我们注意,如果我们这样定义一个变量:

dir := /foo/bar    # directory to put zhe frobs in(:= 这种方法,前面的变量不能使用后面的变量,只能使用前面已经定义好了的变量)

还有一个比较有用的操作符是"?=",先看看实例:

FOO ?= bar

其含义是,如果FOO没有被定义过,那么变量FOO的值就是"bar",如果FOO以前被定义过,那么这条语句将什么也不做,其等价于:ifeq ($(origin FOO), undefined)

                            FOO = bar

                    endif

三 .变量的高级用法

这里介绍两种变量的高级使用方法,第一种是变量值的替换.

我们可以替换变量中的共有的部分,其格式是"$(var : a=b)"或是"${var : a=b}",其意思是,把变量"var"中所有以"a"字串"结尾"的"a"替换成"b"字串.这里的"结尾" 意思是"空格"或是"结束符".

还是看一个实例把:

foo := a.o b.o c.o 

bar := $(foo:.o=.c)

所以我们的"$(bar)"的值就是"a.c b.c c.c".

另外一种变量替换的技术是"静态模式"定义的,如:

foo := a.o b.o c.o

bar := $(foo : %.o=%.c)

第二种高级用法是---"把变量的值再当成变量",先看一个例子:

x = y

y = z

a := $($(x))

这里的$(a)的值就是"z".

把变量的值再当成变量,这种技术,同样可以用在操作符的左边:

dir = foo

$(dir)_sources := $(wildcard $(dir)/*.c)

define $(dir)_print

lpr $($(dir)_sources)

endif


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值