Make 学习笔记三-使用变量

来源:互联网 发布:察哈尔抗日同盟军 知乎 编辑:程序博客网 时间:2024/06/06 09:45

定义一个空值的变量:

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



0 0
原创粉丝点击