Makefile中的变量及条件判断的使用

来源:互联网 发布:苹果手机屏幕录像软件 编辑:程序博客网 时间:2024/05/16 12:47

变量的使用

在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同

的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”,“命令”或是Makefile 的其它部分中。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。有一些变量是很奇怪字串,如“$<”、“$@”等,这些是自动化变量。变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要用“$$”来表示。

变量高级用法:

1. 变量值的替换

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

foo := a.o b.oc.o

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

这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是“a.c b.c c.c”。另外一种变量替换的技术是以“静态模式”定义的,如:

foo := a.o b.oc.o

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

这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的值为“a.c b.c c.c”。

2.把变量的值再当成变量.

x = y

y = z

a := $($(x))

在这个例子中,$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。(注意

是“x=y”,而不是“x=$(y)”)。

3. 追加变量值

我们可以使用“+=”操作符给变量追加值,如果变量之前没有定义过,那么,“+=”会自动变成“=”,如果前面有变量定义,那么“+=”会继承于前次操作的赋值符。如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符,如:

variable :=value

variable += more

等价于:

variable :=value

variable :=$(variable) more

使用条件判断

     使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。条件表达式的语法为:

<conditional-directive>

<text-if-true>

endif

以及:

<conditional-directive>

<text-if-true>

else

<text-if-false>

endif

其中<conditional-directive>表示条件关键字,如“ifeq”。这个关键字有四个。

第一个是“ifeq”

ifeq (<arg1>, <arg2> )

ifeq '<arg1>' '<arg2>'

ifeq "<arg1>""<arg2>"

ifeq "<arg1>"'<arg2>'

ifeq '<arg1>'"<arg2>"

比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。

如:

ifeq ($(strip $(foo)),)

<text-if-empty>

endif

这个示例中使用了“strip”函数,如果这个函数的返回值是空(Empty),那么<text-if-empty>就生效。

第二个条件关键字是“ifneq”。语法是:

ifneq (<arg1>, <arg2> )

ifneq '<arg1>' '<arg2>'

ifneq "<arg1>""<arg2>"

ifneq "<arg1>"'<arg2>'

ifneq '<arg1>'"<arg2>"

其比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。和“ifeq”类似。

第三个条件关键字是“ifdef”。语法是:

ifdef <variable-name>

如果变量<variable-name>的值非空,那到表达式为真。否则,表达式为假。当然,

<variable-name>同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,

其并不会把变量扩展到当前位置。

第四个条件关键字是“ifndef”。其语法是:

ifndef <variable-name>

这个和“ifdef”是相反的意思。