Makefile中的条件判断

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

日常使用 Makefile 编译文件时,可能会遇到需要分条件执行的情况。比如在一个工程文件中可编译的源文件很多,但是它们的类型是不相同的,所以编译文件使用的编译器也是不同的。手动去编文件显然是不可行的,而make 提供条件判断来解决这样的问题。Makefile 中使用条件控制可以做到处理的灵活性和高效性。

下面是条件判断中使用到的一些关键字:

关键字功能
ifeq判断参数是否不相等,相等为 true,不相等为 false。
ifneq判断参数是否不相等,不相等为 true,相等为 false。
ifdef判断是否有值,有值为 true,没有值为 false。
ifndef判断是否有值,没有值为 true,有值为 false。

一、ifeq 和 ifneq

条件判断的使用方式如下:

ifeq (ARG1, ARG2)
ifeq 'ARG1' 'ARG2'
ifeq "ARG1" "ARG2"
ifeq "ARG1" 'ARG2'
ifeq 'ARG1' "ARG2"

实例:

libs_for_gcc= -lgnu
normal_libs=
foo:$(objects)
ifeq ($(CC),gcc)  #括号和关键字之间要使用空格分隔,两个参数之间要使用逗号分隔$(CC) -o foo $(objects) $(libs_for_gcc)
else$(CC) -o foo $(objects) $(noemal_libs)
endif

条件语句中使用到三个关键字“ifeq”、“else”、“endif”。其中:“ifeq”表示条件语句的开始,并指定一个比较条件(相等)。括号和关键字之间要使用空格分隔,两个参数之间要使用逗号分隔。参数中的变量引用在进行变量值比较的时候被展开。“ifeq”下面的命令是条件满足的时候执行的,条件不满足忽略;“else”下面的命令表示当条件不满足的时候执行的部分,不是所有的条件语句都要执行此部分;“endif”是判断语句结束标志。

其实 "ifneq" 和 "ifeq" 的使用方法是完全相同的,只不过是满足条件后执行的语句正好相反。

上面的例子可以换一种更加简介的方式来写:

libs_for_gcc= -lgnu
normal_libs=
ifeq($(CC),gcc)libs=$(libs_for_gcc)
elselibs=$(normal_libs)
endif
foo:$(objects)$(CC) -o foo $(objects) $(libs)

 

二、ifdef 和 ifndef 

它们的主要功能是判断变量的值是不是为空,使用方式如下:

ifdef VARIABLE-NAME

实例1

bar =
foo = $(bar)
all:
ifdef foo@echo yes
else@echo no
endif#变量“foo”的定义是“foo = $(bar)”
#虽然变量“bar”的值为空,但是“ifdef”的判断结果为真,所以结果是yes

实例 2:

foo=
all:
ifdef foo@echo yes
else@echo no
endif#打印的结果是 "no",因为foo确实为空

执行 make 可以看到实例 1打印的结果是 "yes" ,实例 2打印的结果是 "no" 。

在实例 1 中,变量“foo”的定义是“foo = $(bar)”,虽然变量“bar”的值为空,但是“ifdef”的判断结果为真。

这种方式判断变量的值是否为空显然不行,因此当我们需要判断一个变量的值是否为空的时候需要使用“ifeq" 而不是“ifdef”。

注意:在 make 读取 Makefile 文件时,才计算表达式的值,并根据表达式的值决定判断语句中的哪一个部分作为此 Makefile 所要执行的内容。因此在条件表达式中不能使用自动化变量,因为自动化变量在规则命令执行时才有效(或者说自动化变量只能用在规则的命令中?)。更不能将一个完整的条件判断语句分卸在两个不同的 Makefile 的文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSH框架介绍

SSH 为 strutsspringhibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。 定义 集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的We…

Find Minimum in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 思路:如果中间节点的值最大,则取后半…

Makefile的伪目标

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 伪目标,它的目的并不是创建目标文件(所以称作“伪”),而是想去执行这个目标下面的命令。它有点像汇编语言里的标签。 使用伪目标的原因&…

Makefile中的文件包含

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 Makefile 中包含其他的文件,使用的关键字是 "include"。 make 读取到 "include" 关键字时,会暂停读取当前的 Makefile,转去读取…

Eclipse高级使用技巧

1. Eclipse的配置文件导入和导出功能 说明:可以将Eclipse的自定义的工作空间配置文件导出和导入,这样创建多工作空间时候就省去了再设置的烦恼。 2. Eclipse设置显示行号 说明:设置文件现实行号,调试错误的…

hadoop hive 的安装问题

origin: http://blog.163.com/songyalong1117126/blog/static/1713918972014124481752/hadoop hive 的安装问题 2014-02-24 16:10:13| 分类: hadoop|举报|字号 订阅能了一下午终于把hive搞好了,其中出现很多的问题1、hadoop和hive的版本问题&#xff0…

熬之滴水成石:最想深入了解的内容--windows内核机制(6)

58 进程和线程(3) 说完进程再说说线程,线程相比于进程其实有更多可说的内容。首先实现线程调用的数据结构是个栈,该栈记录了调用方法的信息这里面也包括了函数调用及返回的地址。线程肯定是属于某个进程,其控制流可以访…

Google搜索技巧总结

http://blog.sciencenet.cn/blog-44407-229042.html转载于:https://www.cnblogs.com/aze-003/p/4105261.html

【linux】学习6

鸟哥13章的东西 shell script速度较慢,适合用于系统管理,但不适合处理大量数值运算 var$((运算内容)) 可以用来做变量的加减乘除求余运算 total$(($firstnum*$secnu)) declare -i total"$firstnum*$secnu" 上面两句功能一样,建议用…

Makefile嵌套执行make

概述 在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则。如果在一个 Makefile 文件中描述所有模块的编译规则,就会显得很杂乱,执行时也会很不方便。 如果在不同的模块中分别…

core--线程同步(内核模式)

什么是内核?windows操作系统为了更好的管理进程,线程,创建了很多数据结构,这些数据结构运行在windows的底层,并不开放给开发人员;所以开发人员称这些结构为内核,但是为了开发人员能够使用&#…

hive cli启动判断hadoop version的问题

测试环境的hive cli启动时报错:Unable to determine Hadoop version information.hive是一个shell:使用sh -x跟踪运行过程,可以看到其通过hadoop version获取hdfs的版本相关的代码如下:# Make sure were using a compatible version of Hadoo…

Makefile变量的高级用法:变量的替换引用、变量的嵌套使用

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 我们之前已经学习过变量的定义和基本的赋值运算,我们可以更深入的了解一下变量的一些高级的用法。高级使用方法有两种:第一种是变量的替换引用,第二…

SAP Study Notes: BW Queriy-Variables(变量)

About Variable:1.Variable 是和InfoObject绑定的,可用于任何含有该IO的query中。2.Variable有以下几种类型:Characteristic:用于限制Char。 Text:用于在报表动态显示文本。 Hierarchy:用于限制Hierarchy。 Hieararchy…

Makefile中的通配符

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 Makefile 是可以使用 shell 命令的,所以 shell 支持的通配符在 Makefile 中也是同样适用的。 shell 中使用的通配符有:"*","?&qu…

SCCM2012 R2集成WSUS服务器-4:部署软件更新组

在之前的文章中,我们已经创建好的软件更新组,也下载好了补丁,下面我们来部署这些补丁。右击软件更新组,选择”部署“,如图。进入到部署软件更新向导,输入部署的名称,并指定部署的集合。如图。在…

JavaScript Iframe富文本编辑器中的光标定位

最近在项目中碰到一个比较棘手的问题: 在iframe富文本编辑器中,有个工具栏,这个工具栏在iframe标签之外,工具栏上有一个按钮,点击该按钮向iframe正在编辑中的光标处插入一个图片,图片会插入到当前光标所在的…

Makefile目标类型大汇总

模式规则中的目标形式是多种多样的,它可以是一个或多个的文件,也可以是一个伪目标,或者其他的类型,下面是对这些类型的详细说明。 强制目标 如果一个目标中没有命令或者依赖,并且它的目标不是一个存在的文件名&#xf…

网站故障排查几个简单步骤

1、top命令查看cpu消耗多少(id%的值和%cpu要是一直是几百就是问题了。%wa要是大于30%也是压力大了)。还有看负载的3个值(和cpu线程是1比1关系。要是值大于线程书,那么也是压力过大。)top命令要是发现cpu消耗过多,可以知道是哪几个进程了。2、查看硬盘使用…

isset、empty、var==null、is_null、var===null详细理解

//isset: 判断变量是否被初始化 //它并不会判断变量是否为空,并且可能用来判断数组中元素是否被定义 //听说在数组用isset与array_key_exists高出4倍 $a ""; $ar[c] ""; if(!isset($a)){echo $a not isset\r\n; }else{echo $a iss…