Makefile 中:= ?= += =的差别 和条件运行
一:在Makefile中常常看到obj-m := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别:
= 是最主要的赋值
:= 是覆盖之前的值
?= 是假设没有被赋值过就赋予等号后面的值
+= 是加入等号后面的值
例:
1、“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。
看样例:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar 。而不是 foo bar 。
2、“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的终于值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
二:条件推断
例:
对变量“CC”进行推断。值假设是“gcc”那么在进行程序连接时使用库“libgnu.so”或者“libgnu.a”,否则不链接不论什么库
foo: $(objects) ifeq ($(CC),gcc) $(CC) -o foo $(objects) $(libs_for_gcc) else $(CC) -o foo $(objects) $(normal_libs) endif
在上例中,条件语句中使用到了三个keyword:“ifeq”、“else”和“endif”。当中:
1. “ifeq”表示条件语句的開始。并指定了一个比較条件(相等)。之后是用圆括号括包围的、使用逗号“,”切割的两个參数。和keyword“ifeq”用空格分开。參数中的变量引用在进行变量值比較时被展开。“ifeq”之后就是当条件满足make须要运行的,条件不满足时忽略。
2. “else”之后就是当条件不满足时的运行部分。
不是全部的条件语句都须要此部分。
3. “endif”表示一个条件语句的结束,不论什么一个条件表达式都必须以“endif”结束。
keyword1:ifeq
通常我们会使用它来推断一个变量的值是否为空(不是不论什么字符)。參数值可能是通过引用变量或者函数得到的。因而在展开过程中可能造成參数值中包括空字符(空格等)。一般在处理这样的情况时我们使用make的“strip”函数(參考文本处理函数一节)来对它进行处理,去掉变量值中的空字符。
格式为:
ifeq ($(strip $(foo)),)
TEXT-IF-EMPTY
endif
这样。即就是在“$(foo)”中存在若干前导和结尾空格,make在解析Makefile时“TEXT-IF-EMPTY”也会被作为运行的一部分。
keyword2:ifneq
`ifneq (ARG1, ARG2)'
keyword“ifneq”实现的条件推断语句和“ifeq”相反。
首先替换并展开“ARG1”和“ARG1”,对它们的值进行比較。假设不同样(条件为真)则将true作为make要运行的一部分,否则将false作为make要运行的一部分。
keyword3:ifdef
keyword是“ifdef”用来推断一个变量是否定义。
格式为:
`ifdef VARIABLE-NAME'
假设变量“VAEIABLE_NAME”的值非空,那么表达式为真,将“TEXT-IF-TRUE”作为make要运行的一部分。
否则,表达式为假。假设存在“TEXT-IF-FALSE”。就将它作为make要运行一部分。当一个变量没有被定义时,它的值为空。
“VARIABLE-NAME”能够是变量或者函数的引用。
对于“ifdef”须要说明的是:ifdef仅仅是測试一个变量是否有值。其并不会对变量进行替换扩展来推断变量的值是否为空。对于变量“VARIABLE-NAME”,除了“VARIABLE-NAME=”这样的情况以外。使用其他方式对它的定义都会使“ifdef”返回真。就是说,即使我们通过其他方式(比方,定义它的值引用了其他的变量)给它富了一个空值,“ifdef”也会返回真。我们来看一个样例:
例1:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
例2:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
例1中的结果是:“frobozz = yes”;而例2的结果是:“frobozz
= no”。其原因就是在例1中。变量“foo”的定义是“foo = $(bar)”。
尽管变量“bar”的值为空,可是“ifdef”推断的结果是真。因此当我们须要推断一个变量的值是否为空的情况时。须要使用“ifeq”(或者“ifneq”)而不是“ifdef”。可參考前两个小节的内容。
keyword4:ifndef
keyword“ifndef”实现的功能和“ifdef”相反。格式为:
`ifndef VARIABLE-NAME'
这个就不具体讨论了。它的功能就是实现了和“ifdef”相反的条件推断。
在“CONDITIONAL-DIRECTIVE”这一行上,能够以若干个空格開始,make处理时会被忽略这些空格。但不能以[Tab]字符做为開始(不然就被觉得是命令)。条件推断语句中,在除keyword(包含“endif”)之前、和条件表达式的參数中之外。其它不论什么地方都能够使用多个空格或[Tab]字符,它不会影响条件推断语句的功能。相同行尾也能够使用凝视(“#”開始直到一行的结束)。
“else”和“endif”也是条件推断语句的一部分。在书写时它们都是没有不论什么參数的,能够以多个空格開始(相同不能以[Tab]字符開始)多个空格或[Tab]字符结束。行尾相同能够有凝视内容。
在make读取makefile文件时计算表达式的值。并依据表达式的值决定推断语句中那一部分被作为此Makefile所要运行的内容(选择符合条件的语句)。因此在条件表达式中不能使用自己主动化变量,自己主动化变量在规则命令运行时才有效。更不能将一个完整的条件推断语句分写在两个不同的makefile文件里,当中在某一个makefile文件使用指示符“include”包括另外一个。
Makefile 中:= ?= += =的差别 和条件运行的更多相关文章
- Makefile中的ifeq 多条件使用
Makefile中的ifeq 多条件使用 网上关于makefile中ifeq的介绍已经很多了,为什么我还要在写这篇文章,因为他们只说了if else两种条件的情况,并没有讲多于两种条件情况的使用. 多 ...
- GNU Makefile中的条件控制结构
在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...
- [转] Makefile 基础 (7) —— Makefile 中 make 的运行
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- makefile 中=与:=的差别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y = $(x) bar ...
- Makefile中支持的函数大全
一.描述 Makefile的函数调用,很像变量的使用,也是以"$"来标识的,其语法如下: $(<function> <arguments> ) 或是 ${& ...
- Makefile中的函数
Makefile 中的函数 Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写. 函数调用语法如下: $(<function> <arguments ...
- Aspectj 实现Method条件运行
最近我花了半个小时实现了一个Method的按自定义条件运行的plugin,Condition-Run.实现场景是由于我所工作的客户经常会是在同一个代码集上实现多个Brand,所以有些功能只会限制是几个 ...
- makefile中的target到底代表什么?
刚开始用make的时候,以为makefile中名字叫做main的target就是make默认执行的target(中文翻译叫做标的(di,四声),下面统一称呼为标的),然后曾经很天真地犯过这样的错误,就 ...
- Makefile学习(二)条件判断和内嵌函数
第七章:Makefile的条件执行 条件语句可是是两个不同的变量.或者变量和常量值的比较: 7.1例子: 对变量“CC”进行判断,其值如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者 ...
随机推荐
- 正确AJAX了解该技术的,创建,应用
ajax认识: 1. ajax这是间client与server机制.但这一机制是在前台的,利用前台的闲置功能,来进行前台与后台的数据交流,以达到增强用户体检.降低server压力,更有效的利用带宽的效 ...
- C#之网络
首先很不好意思,前段时间把评论的功能给关掉啦,BUT NOW 此功能以开放,欢迎小伙伴们拍砖. 1网络 在网络环境下,我们最感兴趣的两个名称空间是System.Net和System.Net.Socke ...
- (转)SWT的CheckBoxTreeViewer的相关用法
最近在项目中需要用到遍历某个目录下所有文件,并按照树形结构展示,同时还需要提供对树形菜单的选择展开等操作.在eclipse中提供了CheckboxTreeViewer组件来满足所需要的功能 下面是需要 ...
- poj1804(归并排序求逆序数)
逆序数.也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(比如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同一时候,就说 ...
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- Android 将Activity殴打jar包 对于由第三方使用 解决XML 图片 文本资源并不难过进入jar包装问题!
做项目需要打包成jar文件供第三方使用项目要求(将图片 文字资源写到到jar包中,第三方调用时,仅须要在AndroidManifest.xml配置下对应的Activity通过StartActivity ...
- 使用配置文件(.settings、.config)存储应用程序配置
原文:使用配置文件(.settings..config)存储应用程序配置 引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格 ...
- cocos2d-x 精灵的创建和基本使用
在cocos2d-x中.精灵能够说是一个最重要的组成元素,它代表游戏中一个最小的可见单位.同一时候也是CCNode一个最为灵活的子类,由于它能够通过装载一个平面纹理,从而具有丰富的表现力. 在进一步说 ...
- python学习笔记之一:列表与元组
最近在看<python基础教程>(基于python2.x),下面总结一下第二章列表与元组的知识: 在这章中引入了数据结构的概念.数据结构是通过某种方式组织在一起的数据元素的集合.在pyth ...
- Delphi F11 全屏
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...