您的位置:首页 > 其它

Make 学习笔记三-使用变量

2017-02-17 13:52 204 查看
定义一个空值的变量:

nullstring :=

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

nullstring是一个Empty变量,其中什么也没有,而我们的space 的值是一个空格。因为在操作符的右边是很难描述一个空格的,这里采用

的技术很管用,先用一个Empty 变量来标明变量的值开始了,而后面采用“#”注释符来表示变量定义的终止,这样,我们可以定义出其值是一个空格的变量。

操作符?=

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)

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

通配符替换:

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

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

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

变量的值再当变量:

x = y

y = z

z = u

a := $($($(x)))

这里的$(a)的值是“u”

追加变量:

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

define 指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef 关键字结束。其工作方式和“=”操作符一样。变量的值

可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头,所以如果你用define 定义的命令变量中没有以[Tab]键开头,

那么make 就不会把其认为是命令。

下面的这个示例展示了define 的用法:

define two-lines

echo foo

echo $(bar)

endef

系统环境变量和make 所定义的变量:

make 运行时的系统环境变量可以在make 开始运行时被载入到Makefile 文件中,但是如果Makefile 中已定义了这个变量,或是这个

变量由make 命令行带入,那么系统的环境变量的值将被覆盖。(如果make 指定了“-e”参数,那么,系统环境变量将覆盖Makefile 中定义的变量)

make中的条件语句:

ifeq、else 和endif。ifeq

的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else 表示条件表达式为

假的情况。endif 表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。

基本语法:

<conditional-directive>

<text-if-true>

else

<text-if-false>

endif

其中<conditional-directive>表示条件关键字,

在<conditional-directive>这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了

例子:

libs_for_gcc = -lgnu

normal_libs =

foo: $(objects)

ifeq ($(CC),gcc)

$(CC) -o foo $(objects) $(libs_for_gcc)

else

$(CC) -o foo $(objects) $(normal_libs)

endif

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: