第七章:Makefile的条件执行

条件语句可是是两个不同的变量、或者变量和常量值的比较;

7.1例子:

对变量“CC”进行判断,其值
如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者“libgnu.a ”,否则不链接任
何库。

……
libs_for_gcc = -lgnu
normal_libs =

……

foo: $(objects)

ifeq ($(CC),gcc)
$(CC) -o foo $(object s) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
……

7.2.1.1关键字ifeq

通常我们会使用它来判断一个变量的值是否为空(不是任何字符)。参数值可能是
通过引用变量或者函数得到的,因而在展开过程中可能造成参数值中包含空字符(空格
等)。

7.2.1.2关键字ifneq

7.2.1.3关键字ifdef

判断一个变量是否已经定义。

7.2.1.4关键字ifndef

在除关键字(包括“endif”)之前、条件表达式参数中之外的其他任何地方
都可以使用多个空格或[Tab]字符,它不会影响条件判断语句的功能。

7.3标记测试的条件语句

使用条件判断语句、MAKEFLAGS和函数fingstring实现对make命令行选项的测试

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif

判断make命令行参数中是否包含-t,对archice.a执行不同的操作。

第八章make的内嵌函数

8.1函数的调用语法

格式如下:

$(FUNCTION ARGUMENTS)

或者:

${FUNCTION ARGUMENTS}

说明:1.对于用户自己的函数需要通过make的call函数来间接调用

2.“ARGUMENTS”是函数的参数,参数和函数名之间使用若干个空格或者[tab]字符分割

3.以“$ ”开头,使用成对的圆括号或花括号把函数名和参数括起

8.2文本处理函数

$(subst FROM,TO,TEXT) 字符串替换

$(patsubst PATTERN,REPLACEMENT,TEXT) 模式替换函数

$(strip STRINT) 去空格函数

$(findstring FIND,IN) 如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。

$(filter PATTERN…,TEXT) 例子如下

sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo

$(filter-out PATTERN...,TEXT)

过滤掉字串“TEXT”中所有符合模式
“PATTERN”的单词,保留所有不符合此模式的单词。

$(sort LIST) 给字串“LIST”中的单词以首字母为准进行排序(升序),并取掉重复的单词

$(word N,TEXT) 返回字串“TEXT”中第“N”个单词

$(wordlist S,E,TEXT)

函数功能:从字串“TEXT”中取出从“S ”开始到“E ”的单词串。“S ”和“E ”
表示单词在字串中位置的数字

8.2.10 $(words TEXT) 字算字串“TEXT”中单词的数目。

$(firstword NAMES…) 字串“NAMES…”的第一个单词。

8.3文件名处理函数

8.3.1 $(dir NAMES…) 取目录函数—dir。

$(notdir NAMES…) 取文件名函数

其他一系列函数:

$(suffix NAMES…) 取后缀函数$(basename NAMES…) 取前缀函数$(addsuffix SUFFIX,NAMES…)

$(addsuffix SUFFIX,NAMES…) 加后缀函数,为“NAMES…”中的每一个文件名添加后缀“SUFFIX”。

$(addprefix PREFIX,NAMES…)

$(join LIST1,LIST2) 单词连接函数$(wildcard PATTERN)获取匹配模式文件名函数

$(wildcard *.c)
返回值为当前目录下所有.c 源文件列表。、

8.4foreach函数,它是一个循环函数

$(foreach VAR,LIST,TEXT)

执行时把“LIST”中使用空格分割的单词依次取出赋值给变量
“VAR ”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为
空时结束)。

8.5if函数

$(if CONDITION,THEN-PART[,ELSE-PART])

第一个参数“CONDITION”,在函数执行时忽略其前导和结尾空字

符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
展开结果非空,则条件为真,就将第二个参数“THEN_PATR ”作为函数的计算
表达式;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
函数的表达式,函数的返回结果为有效表达式的计算结果。

8.6call函数

使用这个函数可以实现对用户自己定义函数引用

“call”函数是唯一一个可以创建定制化参数函数的引用函数。

$(call VARIABLE,PARAM,PARAM,...)

我们可以将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获得不同的结果。

$(value VARIABLE) 提供一种在不对变量进行展开的情况下获取变量值的方法

8.8eval函数

eval函数返回值为空,

函数“eval ”是一个比较特殊的函数。使用它可以在Makefile中构
造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。

8.9origin函数

函数“origin”的动作不是操作变量(它的参数)。
它只是获取此变量(参数)相关的信息,告诉我们这个变量的出处(定义方式)。

$(origin VARIABLE) 返回值:返回“VARIABLE ”的定义方式。用字符串表示。

函数返回有以下几种:

1.undefined

2.default,说明VARIABLE是一个默认定义变量(内嵌变量)

3.environment,变量“VARIABLE ”是一个系统环境变量,并且make没有使用命令行选项“-e

4.environment override,系统环境变量,make使用了-e

5.file,在某个makefile文件中定义

6.command line在命令行中定义

7.override使用该指示符声明的

8.automatic自动化变量

8.10shell

函数shell函数不同于除“wildcard”函数之外的其它函数。make可以使用它来和外部通信。

8.11make的控制函数

$(error TEXT…)产生致命错误,并提示“TEXT”信息给用户,并退出make执行

$(warning TEXT…)

Makefile学习(二)条件判断和内嵌函数的更多相关文章

  1. 从头開始写项目Makefile(十):make内嵌函数及make命令显示

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com]     这一节我们讲一下make的函数,在之前的章节已经讲到了几 ...

  2. 从头开始写项目Makefile(十):make内嵌函数及make命令显示【转】

    转自:http://blog.csdn.net/shallnet/article/details/38314473#comments 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章 ...

  3. Makefile所有内嵌函数

    一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1       $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...

  4. Makefile学习二

    今天继续对Makefile进行研究,话不多说,进入正题: make常用内嵌函数: 下面利用上面的知识点来实现一个多级目录的Makefile,如下: 多级目录Makefile: 这个例子的目录结构如下: ...

  5. Shell学习(六)——条件判断总结

    Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...

  6. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...

  7. 函数:内嵌函数和闭包 - 零基础入门学习Python020

    函数:内嵌函数和闭包 让编程改变世界 Change the world by program 内嵌函数和闭包 接下来这两节课我们谈的话题可能会"比较高级",所以如果是零基础的朋友, ...

  8. Makefile---make内嵌函数及make命令显示 (九)

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...

  9. Python3基础 内嵌函数 简单示例

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

随机推荐

  1. java 不同意同一账户不同IP 同一时候登录系统解决的方法 兼容IE Firefox

    需求就是 不同意同一个账户同一时间登录系统.仅仅要有一个账户在线其它人就是不能用这个账户. 功能非常easy,过程非常纠结 . 这篇文章攻克了兼容IE.Firefox 浏览器下,不同IP 地址 同一用 ...

  2. boost之ThreadPool

    threadpool是基于boost库实现的一个线程池子库,但线程池实现起来不是很复杂.我们从threadpool中又能学到什么东西呢? 它是基于boost库实现的,如果大家对boost库有兴趣,看看 ...

  3. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  4. Hibernate项目里配置环境时,jar包配置不当会对测试结果产生影响。

    问题情况: 如下图所示,该图中,显示了一堆错误的jar包.这是导致了Junit4测试通过了,数据库却没反应的原因. 原因: 之所以出现这种情况,eclipse其实已经告诉了我们原因.如下图所示,这些j ...

  5. javascript sort 用法

    <html> <head> <title></title> <script type="text/javascript" sr ...

  6. C#_Stopwatch 类

    命名空间:System.Diagnostics Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 Stopwatch 方案中,先调用 Start 方 ...

  7. FANTASY:In which way do you think the world will end?

    In which way do you think the world will end? The moment you are reading my essay, you are somehow c ...

  8. Jade学习笔记

    初学nodejs,折腾过用handlebars做模板,后来隔了一段重新学习,用了jade,真心简洁……记录一些学习笔记,以备复习. jade是基于缩进的,所以tab与space不能混用: 属性的设置: ...

  9. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  10. ECSTORE1.2 重启开启信任登陆模块(删除KEY)

    1).若启用Mongodb 需要删除KEY分别为 1 2 3 be90a668d9f2eb1950bae1bf6b0835ce 939e64939c3f65cfb646e7948c5b80df 58d ...