06-07 -变量的高级主题

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 变量值的替换
  • 2. 变量的模式替换
  • 3. 规则中的模式替换
  • 4. 变量值的嵌套使用
  • 5. 命令行变量
  • 6. 环境变量
  • 7. 目标变量(局部变量)
  • 8. 模式变量
  • 9. 工程

1. 变量值的替换

  • 使用指定字符(串)替换变量值中的后缀字符(串)
  • 语法格式:$(var:a=b)${var:a=b},即:使用 b 替换变量 var 的后缀 a
    • 替换表达式中不能有任何的空格
    • make 中支持使用 ${} 对变量进行取值
src := a.cc b.cc c.cc
obj := $(src:cc=o)

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

在这里插入图片描述

2. 变量的模式替换

  • 使用 % 保留变量值中的指定字符串,替换其它字符。% 可以理解为 Makefile 中的通配符
  • 语法格式:$(var:a%b=x%y)${var:a%b=x%y}
    • 替换表达式中不能有任何空格
    • make 中支持使用 ${} 对变量进行取值
src := a1b.c a2b.c a3b.c
obj := $(src:a%b.c=x%y)

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

在这里插入图片描述

3. 规则中的模式替换

在这里插入图片描述

  1. %.o 在 OBJS 中匹配子目标,首先找到 func.o
  2. 再根据 func.o 找个子目标生成依赖 func.c,构成整个规则 func.o: func.c
  3. 继续 1 和 2,匹配其它子目标
.PHONY : clean rebuild all

target := hello.out
CC := gcc

obj : main.o func.o

#使用模式规则替换,避免每一条.c都要写一个编译命令
$(obj) : %o : %c
	$(CC) -o $@ -c $^

$(target) : main.o func.o
	$(CC) -o $@ $^

all : $(target)

rebuild : clean all

clean : 
	rm -f *.o $(target)

在这里插入图片描述

4. 变量值的嵌套使用

  • 一个变量名之中可以包含对其它变量的引用
  • 嵌套引用的本质是使用一个变量表示另外一个变量

在这里插入图片描述

x := y
y := z
val := $($(x))

all:
	@echo "val => $(val)"

在这里插入图片描述

5. 命令行变量

  • 运行 make 时,在命令行定义变量
  • 命令行变量默认覆盖 makefile 中定义的变量
hm := hello makefile

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

在这里插入图片描述

  • override 关键字
    • 使用 override 关键字可以防止 makefile 中定义的变量被命令行变量覆盖
    • override 用于指示 makefile 中定义的变量不能被覆盖
    • 变量的定义和赋值都需要使用 override 关键字
      在这里插入图片描述
  • define 关键字
    • 用于在 makefile 中定义多行变量
    • 多行变量的定义从变量名开始到 endef 结束
    • 可使用 override 关键字防止变量被覆盖
    • define 定义的变量等价于使用 = 定义的变量
define fool
I'm fool!
endef

override define cmd
	@echo "run cmd here"
endef

test:
	@echo "fool => $(fool)"
	$(cmd)

在这里插入图片描述

6. 环境变量

  • makefile 中能够直接使用环境变量的值
    • makefile 中定义与环境变量同名的变量,环境变量会被覆盖
    • 运行 make 时指定 -e 选项,优先使用环境变量
  • 变量在不同 makefile 之间的传递
    • 直接在外部定义环境变量进行传递(不推荐,因为依赖于系统,导致 makefile 的移植性问题)
    • 使用 export 定义变量进行传递(定义临时环境变量)
    • 定义 make 命令行变量进行传递(推荐做法)
HOME := new_home

test:
	@echo "$(HOME)"

由 make 结果可知,系统中的环境变量 HOME 的内容 /home/wx,在 makefile 中被改为了 new_home

在这里插入图片描述

# Makefile

HOME := new_home
var := uuxiang

test:
	@echo "HOME => $(HOME)"
	@echo "var => $(var)"
	@echo "make Makefile.2"
	@$(MAKE) -f Makefile.2

# Makefile.2

test:
	@echo "HOME => $(HOME)"
	@echo "var => $(var)"

make 时,HOME 被临时改写为了 new_home,因此,这个值被传递到 Makefile.2 中,而 var 的作用域只在 Makefile 中,取法传递到 Make file.2 中,因此,输出为空。
在这里插入图片描述

如果想要将 var 也传递到 Makefile.2 中,可以使用 export 关键字。

# Makefile

HOME := new_home
export var := uuxiang
new := hello

test:
	@echo "HOME => $(HOME)"
	@echo "var => $(var)"
	@echo "make Makefile.2"
	@$(MAKE) -f Makefile.2
	@$(MAKE) -f Makefile.2 new:=$(new)

# Makefile.2

test:
	@echo "HOME => $(HOME)"
	@echo "var => $(var)"
	@echo "new => $(new)"

export 关键字修饰 var 变量,使其成为临时环境变量,这样就可以传递到 Makefile.2 中了。

在这里插入图片描述

7. 目标变量(局部变量)

  • 作用域只在指定目标及连带规则中
var := hello

test: var := test-var

test: another
	@echo "test:"
	@echo "var => $(var)"

another:
	@echo "another:"
	@echo "var => $(var)"

test: var := test-var,即定义了目标变量 var,此时这个变量的值 test-var 的作用域在 test 目标及其连带规则中,而在其它地方,var 变量的值仍然为 hello,这个变量值的作用域为整个文件。

在这里插入图片描述

var := hello

test: var := test-var

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

another:
	@echo "another:"
	@echo "var => $(var)"

在这里插入图片描述

8. 模式变量

  • 模式变量时目标变量的扩展
  • 作用域只在符合模式的目标及连带规则中
var := hello

test: var := test-var

new := uuxiang

%e: override new := test-new

test:
	@echo "test:"
	@echo "var => $(var)"
	@echo "new => $(new)"

rule:
	@echo "rule:"
	@echo "var => $(var)"
	@echo "new => $(new)"

rule 目标对应的规则符合 %e 模式,因此,rule 规则中的 new 输出为 test-new 为模式变量。

在这里插入图片描述

9. 工程

【06-07 变量的高级主题】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华人团队用大模型实现“读心术”:大脑活动直接变文字

NeurIPS收录的一项新研究,让大模型也学会“读心术”了! 通过学习脑电波数据,模型成功地把受试者的脑电图信号翻译成了文本。 而且整个过程不需要大型设备,只要一块特制的“头巾”就能实现。 这项成果名为DeWave,能在…

观测云 VS ELK:谁是日志监控的王者?

前言 作为 IT 信息系统运行状态感知和故障分析的重要手段,日志在行业兴起之初便为运维和开发环节所广泛应用。当应用和系统发生故障或出现问题时,日志数据成为了排查和诊断问题的重要依据。通过分析日志,开发人员和运维人员可以了解系统的运…

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?

你的项目或许已经使用 Redis 很长时间了,但在使用过程中,你可能还会或多或少地遇到以下问题: 我的 Redis 内存为什么增长这么快?为什么我的 Redis 操作延迟变大了?如何降低 Redis 故障发生的频率?日常运维…

LeetCode刷题记(五):121~150题

121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

59-ARM与FPGA间RGMII通信电路设计

视频链接 ARM与FPGA间RGMII通信电路设计01_哔哩哔哩_bilibili ARM与FPGA间RGMII通信电路设计 第2课:千兆以太网电路设计 第3课:万兆网电路设计 第49课:PCIE转网口电路设计 第50课:RGMII & SGMII & QGMII电路设计 1、…

在做题中学习(51): x的平方根

69. x 的平方根 - 力扣(LeetCode)​​​​​​ 解法:二分查找 思路:看示例2: 可以看到8的平方根是2.82,在2^2和3^2之间,所以可以把数组分为两部分,(具有二段性) 而2.82去掉小数部…

java线上问题排查之内存分析(三)

java线上问题排查之内存分析 使用top命令 top命令显示的结果列表中,会看到%MEM这一列,这里可以看到你的进程可能对内存的使用率特别高。以查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等。 2.用jstat命令…

CCE云原生混部场景下的测试案例

背景 企业的 IT 环境通常运行两大类进程,一类是在线服务,一类是离线作业。 在线任务:运行时间长,服务流量及资源利用率有潮汐特征,时延敏感,对服务SLA 要求高,如电商交易服务等。 离线任务&…

shell脚本脚本变量

shell脚本的概念: 1.讲要执行的命令按顺序保存到一个文本文件 2.给文件可执行权限 3.可以结合各种shell控制语句以完成更复杂的操作 linux中包含shell的文件有 [rootlocalhost ~]# cat /etc/shells /bin/sh #UNIX最初使用的 shell,已经被…

AI编码时代到来?实现编程梦想的利器—Baidu Comate测评

文章目录 Comate智能编码是什么?Comate支持的环境 Comate应用安装实际操作对话式生成代码生成代码注释智能单测项目测试调优功能 总结 Comate智能编码是什么? 在如今这个拥抱AI的时代,市面上已经产出了很多Ai代码助手,如果你还没…

Java clone

Java clone 原型模式用一个已经创建的实例作为原型,通过复制(clone)该原型对象来创建一个和原型对象相同的新对象。Java中对象克隆需要重写Object.clone()方法,并实现Cloneable接口。 浅克隆 浅克隆仅仅克隆本对象,…

关于Oracle 23ai 你要知道的几件事情

1.版本生命周期 23ai发布后的Oracle版本生命周期图,可以看到23ai是长期支持版本可以到2032年。 引申 Oracle版本分为两类 Innovation Release--创新版本,一般提供至少两年技术支持 Long Term Release --长期支持版本,一般提供5年premier和…

MacOS快速安装FFmpeg,并使用FFmpeg转换视频

前言:目前正在接入flv视频流,但是没有一个合适的flv视频流地址。网上提供的flv也都不是H264AAC(一种视频和音频编解码器组合),所以想通过fmpeg来将flv文件转换为H264AAC。 一、MacOS环境 博主的MacOS环境(…

DAPP开发:揭秘DAPP软件开发的秘密

随着区块链技术的飞速发展,DAPP(去中心化应用)的开发逐渐成为了一个热门话题。在本文中,我们将探讨如何从零开始开发DAPP软件,并深入思考DAPP开发中的关键问题。 一、了解DAPP开发的基础知识 在开始开发DAPP之前&…

大数据API技术分享:使用API接口采集淘宝数据(商品详情丨关键词搜索丨店铺所有商品)

使用API接口采集淘宝数据(商品详情、关键词搜索、店铺所有商品)是大数据领域常见的应用场景。以下是一些关于如何使用API接口进行这些操作的技术分享: 1. 获取API权限 首先,你需要在淘宝开放平台注册成为开发者,并创建…

【最大公约数 并集查找 调和级数】1998. 数组的最大公因数排序

本文涉及知识点 最大公约数 并集查找 调和级数 LeetCode1998. 数组的最大公因数排序 给你一个整数数组 nums ,你可以在 nums 上执行下述操作 任意次 : 如果 gcd(nums[i], nums[j]) > 1 ,交换 nums[i] 和 nums[j] 的位置。其中 gcd(nums…

免备案香港主机会影响网站收录?

免备案香港主机会影响网站收录?前几天遇到一个做电子商务的朋友说到这个使用免备案香港主机的完整会不会影响网站的收录问题,这个问题也是站长关注较多的问题之一。小编查阅了百度官方规则说明,应该属于比较全面的。下面小编给大家介绍一下使用免备案香…

OpenAI的搜索引擎要来了!

最近的报道和业界泄露信息显示,OpenAI正秘密研发一款新的搜索引擎,可能叫SearchGPT或Sonic,目标是挑战Google的搜索霸权。预计这款搜索引擎可能在5月9日即将到来的活动中正式亮相。 SearchGPT的蛛丝马迹 尽管OpenAI对SearchGPT尚未表态&…

语音识别技术初级应用

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

纹理映射技术在AI去衣应用中的关键作用

引言: 随着人工智能技术的飞速发展,其在图像处理领域中的应用也日益广泛。AI去衣,作为一种颇具争议的技术应用,指的是利用深度学习算法自动移除或替换图片中的衣物。在这一过程中,纹理映射技术扮演了不可或缺的角色。本…