当前位置: 首页 > news >正文

make--变量 条件判断 函数定义及调用

一.变量的高级主题

A.变量值的替换
1.使用指定字符(串)替换变量中的后缀字符(串)
2.语法格式:$(var:a=b) (将a替换成b)
a.替换表达式中不能有任何的空格
b.make中支持使用${}对变量进行取值
示例

src:=a.cc b.cc c.cc
obj:=$(src:cc=o)  

test:
    @echo "obj=>$(obj)"

输出结果
make--变量 条件判断 函数定义及调用
由上图可以看出变量值的替换
B.变量的模式替换
1.使用%保留变量值中的指定字符,替换其它字符
2.语法格式:$(var:a%b=x%y)
a.替换表达式中不能有任何的空格
b.make中支持使用${}对变量进行取值
示例

src:=a1b.c  a2b.c  a3b.c
obj:=$(src:a%b.c=x%y)  

test:
    @echo "obj=>$(obj)"

输出结果
make--变量 条件判断 函数定义及调用
C.变量值的嵌套引用
1.一个变量名之中可以包含对其它变量的引用
2.嵌套引用的本质是使用一个变量表示另一个变量
如图所示
make--变量 条件判断 函数定义及调用
D.命令行变量
1.运行make时,在命令行定义变量
2.命令行变量默认覆盖makefile中定义的变量
示例及运行结果
make--变量 条件判断 函数定义及调用
E.override关键字
1.用于指示makefile中定义的变量不能被覆盖
2.变量的定义和赋值需要使用override关键字
示例及运行结果
make--变量 条件判断 函数定义及调用
F.define关键字
1.用于在makefile中定义多行变量
2.多行变量的定义从变量名开始到endef结束
3.可使用override关键字防止变量被覆盖
4.define定义的变量等价于使用=定义的变量
示例及运行结果
make--变量 条件判断 函数定义及调用

二.条件判断语句

A.makefile中支持条件判断语句
1.可以根据条件的值来决定make的执行
2.可以比较两个不同变量或者变量和常量值
make--变量 条件判断 函数定义及调用
需要注意的是:条件判断语句只能用于控制make实际执行的语句;但是,不能控制规则中命令的执行过程
make--变量 条件判断 函数定义及调用
条件判断的关键字有四种:

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

make--变量 条件判断 函数定义及调用
注意:
1.条件判断语句之前可以有空格,但不能有Tab字符
2.在条件语句中不要使用自动变量($^,$<)
3.一条完整的条件语句必须位于同一个makefile中
4.条件判断类似C语言中的宏,预处理阶段有效,执行阶段无效
5.make在加载makefile时(首先计算表达式的值--赋值方式不同,计算方式不同;根据判断语句的表达式决定执行的内容)

三.函数定义及调用

A.makefile中支持函数的概念
1.make解释器提供了一系列的函数供makefile调用
2.在makefile在支持自定义函数实现,并调用执行
3.通过define关键字实现自定义函数
B.自定义函数的语法
make--变量 条件判断 函数定义及调用
深入理解自定义函数
1.自定义函数是一个多行变量,无法直接调用
2.自定义函数时一种过程调用,没有任何的返回值
3.自定义函数用于定义命令集合,并应用于规则中
示例及运行结果
make--变量 条件判断 函数定义及调用
注意:$(call func2, mylove, dandanxiaohai)对应于func2中的三个参数,通过call进行调用
C.make解释器中的预定义函数
1.make的函数提供了处理文件名,变量和命令的函数
2.可以在需要的地方调用函数来处理指定的参数
3.函数在调用的地方被替换为处理结果
预定义函数的调用
make--变量 条件判断 函数定义及调用
示例及运行结果

.PHONY : test

define func1
    @echo "My name is $(0)"
endef

define func2
    @echo "My name is $(0)"
endef

var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.cpp)

test :
    @echo "var1 => $(var1)"
    @echo "var2 => $(var2)"
    @echo "var3 => $(var3)"
    @echo "var4 => $(var4)"

make--变量 条件判断 函数定义及调用
分析:
1.makefile中不支持真正意义上的自定义函数
2.自定义函数的本质时多行变量
3.预定义的call函数在调用时将参数传递给多行变量
4.自定义函数是call函数的实参,并在call中被执行

转载于:https://blog.51cto.com/13475106/2345721

相关文章:

  • 林斌:小米双折叠手机来了 会考虑未来做成量产机发布
  • VRChat简易教程2-创建一个最基本的世界(world)
  • PHP扩展库PEAR被攻击,近半年下载者或被影响
  • Docker: 容器互访的三种方式
  • D. Diverse Garland
  • 火箭主帅德安东尼赞哈登低位防守:他是控球中锋
  • Problem C: [noip2016十连测第五场]travel (构造+贪心)
  • 年终总结,程序员票选最喜欢的编程语言花落谁家?
  • js 基本数据类型
  • 自己写一个mvc框架吧(三)
  • IDEA 超级好用的插件
  • 微软是如何使用C#重写C#编译器并将其开源的
  • 前端小报 - 201901 月刊
  • DNS 故障导致微软 Azure 云服务的数据库被删除
  • 05-内联函数
  • bootstrap创建登录注册页面
  • CSS 三角实现
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • C学习-枚举(九)
  • learning koa2.x
  • Map集合、散列表、红黑树介绍
  • php ci框架整合银盛支付
  • Python_OOP
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 从tcpdump抓包看TCP/IP协议
  • 对象管理器(defineProperty)学习笔记
  • 今年的LC3大会没了?
  • 实习面试笔记
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​TypeScript都不会用,也敢说会前端?
  • # 安徽锐锋科技IDMS系统简介
  • (04)odoo视图操作
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (三)uboot源码分析
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)visual stdio 书签功能介绍
  • (转)关于pipe()的详细解析
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .chm格式文件如何阅读
  • .NET 5种线程安全集合
  • .NET Core 中的路径问题
  • .NET 命令行参数包含应用程序路径吗?
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net多线程总结