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
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
相关文章推荐
- php学习笔记(三十七)smarty中的变量调节器使用
- php学习笔记(三十五)smarty模板中使用变量的三种方式
- Django学习笔记(1) -- Settings全局变量使用
- Chap 4 学习笔记-使用C#存储变量数据
- JavaScript学习笔记3-变量的声明和使用
- 黑马程序员_C#基础知识学习笔记:变量的使用和命名规则
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- Java学习笔记摘录(标识符/变量是什么/如何命名变量/数据类型/变量的使用规则)
- (原创)c#学习笔记05--变量的更多内容01--类型转换03--使用Convert命令进行显式转焕
- C++学习笔记,关于一个文件中的全局变量在其他文件中的使用
- php学习笔记(一)变量的声明与使用
- 《Ext江湖》学习笔记--JS中变量、对象和数组的定义与使用
- linux编程学习笔记(五) make的使用和Makefile
- 学习笔记---C语言中全局变量,变量,常量的定义与使用
- C++ Primer学习笔记:变量使用小结
- AutoMake 学习笔记---使用过程
- C# 从入门到精通 学习笔记1 第2章 使用变量、操作符和表达式
- angularjs学习笔记之三(变量及过滤器Filter的使用)
- JMeter学习笔记19-函数和变量的使用
- android 开发零起步学习笔记(十九):android使用全局变量的两种方法