makefile变量

article/2025/10/2 20:31:11

1.变量和不同的赋值方式
(1)makefile中支持程序设计语言中变量的概念
(2)makefile中的变量只代表文本数据(字符串)
(3)makefile中的变量名规则
变量名可以包含字符,数字,下划线
不能包含“:”,"#","=“或” "
变量名大小写敏感
(4)变量的定义和使用

cc:=gcc
TARGET:=hello.out  //变量定义$(TARGET):func.o main.o$(cc) -o $(TARGET) func.o main.o  //变量使用

(5)makefile中变量的赋值方式
简单赋值(:=)
递归赋值(=)
条件赋值(?=)
追加赋值(+=)

简单赋值(:=):
程序设计语言中的通用的赋值方式
只针对当前语句的变量有效

x := foo
y := $(x)b
x := new.PHONY : test
test:@echo "x => $(x)"  //x=> new@echo "y => $(y)"  //y=> foob

递归赋值(=):
赋值操作可能影响多个其他变量
所有与目标变量相关的其他变量都将受到影响

x = foo
y = $(x)b
x = new.PHONY : test
test:@echo "x => $(x)"  //x=> new@echo "y => $(y)"  //y=> newb

条件变量(?=):
如果变量未定义,使用赋值符号中的值定义变量
如果变量已经定义,赋值无效

x := foo
y := $(x)b
x ?= new.PHONY : test
test:@echo "x => $(x)"  //x=> new@echo "y => $(y)"  //y=> foob

追加赋值(+=):
原变量值之后加上一个新值
原变量值与新值之间由空格隔开

x := foo
y := $(x)b
x += $(y).PHONY : test
test:@echo "x => $(x)"  //x=> foo foob@echo "y => $(y)"  //y=> foob

2.预定义变量的使用
(1)在makefile中存在一些预定义的变量
自动变量:
@ , @, @^,$<
特殊变量
$(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST)
$(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES)

自动变量的意义:
$@:当前规则中触发命令被执行的目标
$^:当前规则中的所有依赖
$<:当前规则中的第一个依赖

all : first second third@echo "\$$@ => $@"@echo "$$^ => $^"@echo "$$< => $<"

注意:
1." " 对 于 m a k e f i l e 有 特 殊 意 义 输 出 时 需 要 加 上 一 个 " "对于makefile有特殊意义 输出时需要加上一个" "makefile"“进行转义
2.”$@“对于Bash Shell有特殊含义
输出时需要加上”"进行转义

特殊变量的含义:
$(MAKE):当前make解释器的文件名
$(MAKECMDGOALS):命令行中指定的目标名(make的命令行参数)
$(MAKEFILE_LIST):
make所需处理的makefile文件列表
当前makefile的文件名总是位于列表的最后
文件名之间以空格进行分隔
$(MAKE_VERSION):当前make解释器的版本
$(CURDIR):当前make解释器的工作目录
$(.VARIABLES):所有已经定义的变量名列表(预定义变量和自定义变量)

小结:
makefile提供了预定义变量供开发者使用
预定义变量的使用能够使得makefile的开发更高效
自动变量是makefile中最常见的元素
使用$(.VARIABLES)能够获取所有的特殊变量

3.变量的高级主题
(1)变量值的替换
使用指定字符(串)替换变量值中的后缀字符(串)
语法格式: ( v a r : a = b ) 或 (var:a=b)或 (var:a=b){vat:a=b}
替换表达式中不能有任何的空格
make中支持使用${}对变量进行取值

src := a.cc b.cc c.cc
obj := $(src:cc=o)
test:@eccho "obj => $(obj)"

(2)变量的模式替换
使用%保留变量值中的指定字符,替换其他字符
语法格式: ( v a r : a (var:a%b=x%y)或 (var:a{var:a%b=x%y}
替换表达式中不能有任何的空格
make中支持使用${}对变量进行取值

src := a1b.c a2b.c a3b.c
obj := $(src:a%b.c=x%y)
test:@eccho "obj => $(obj)"

(3)规则中的模式替换
targets : target-pattern : preerq-pattern
command1
command2

意义:通过target-parttern从targets中匹配字目标;再通过prereq-pattern从字目标生成依赖;进而构成完整的规则。
在这里插入图片描述
(4)变量值的嵌套引用
一个变量名之中可以包含对其它变量的引用
套嵌引用的本质是使用一个变量表示另外一个变量

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

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

hm := hello makefile
test:@echo "hm => $(hm)"make hm=cmd hm => cmd

(5)override关键字
用于指示makefile中定义的变量不能被覆盖
变量的定义和赋值都需要使用override关键字

override hm := hello makefile
test:@echo "hm => $(hm)"make hm=cmd hm => hello makefile

(6)define关键字
用于在makefile中定义多行变量
多行变量的定义从变量名开始到 endef 结束
可使用 override 关键字防止变量被覆盖
define定义的变量等价于使用 = 定义的变量

define foo
I am fool!
endefoverride define cmd@echo "run cmd is ..."@ls
endef

(7)环境变量(全局变量)
makefile中能够直接使用环境变量的值
定义了同名变量,环境变量将被覆盖
运行make时指定 “e” 选项,优先使用环境变量

为什么要在makefile中使用环境变量?
优势:环境变量可以在所有makefile中使用
劣势:过多的依赖于环境变量会导致移植性降低

变量在不同makefile之间的传递方式
直接在外部定义环境变量进行传递
使用export定义变量进行传递(定义临时环境变量)
定义make命令行变量进行传递(推荐)

(8)目标变量(局部变量)
作用域只在指定目标及连带规则中
target : name value
target : override name calue

var := CKY
test : var := test_var  //作用域只在指定目标及连带规则中,test是目标
test:@echo "test:"@echo "var => $(var)"

模式变量:
模式变量是目标变量的扩展
作用域只在符合模式的目标及连带规则中
pattern : name value
pattern : override name value

new := CKY
%e : override new := test_new  //%e,通配符,以e结尾的目标
rule:@echo "rule:"@echo "new => $(new)"

小结:
makefile中的三种变量:
(1)全局变量:makefile外部定义的环境变量
(2)文件变量:makefile中定义的变量
(3)局部变量:指定目标的变量


http://chatgpt.dhexx.cn/article/arNmBSD8.shtml

相关文章

Makefile介绍

Makefile 是一种常用于编译的脚本语言&#xff0c;它可以更好更方便的管理你的项目的代码编译&#xff0c;节约编译时间&#xff08;没改动的文件不编译&#xff09;。 注意 Makefile 文件命令必须是 Makefile 或者 makefile&#xff0c;并使用 make 命令编译。 1. 1个…

如何编写一个Makefile文件(手把手的教你)

如果有帮助&#xff0c;希望点赞支持&#xff0c;我会更有创作的动力哦 目录 一、概念理解&#xff08;彩蛋藏在某个地方&#xff09;1.1 什么是Makefile&#xff1f;1.2 为何使用Makefile&#xff1f; 二、实战代码演示与讲解2.1 没有makefile的项目是怎么创建运行的2.1.1 创建…

Makefile入门(超详细一文读懂)

1、Makefile编译过程 Makefile文件中的命令有一定规范&#xff0c;一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。不同厂家的make可能会稍有不同&#xff0c;并且语法上也有区别&#xff0c;不过基本思想都差不多&#xff0c;主要还是落在目标依赖…

刘玉真先生语录

或问&#xff1a;“古今之法门多矣&#xff0c;何以此教独名‘净明忠孝’ ? ” 先生曰&#xff1a;“别无他说&#xff0c;‘净明’只是正心诚意&#xff0c;‘忠孝’只是扶植纲常。但世人习闻此语&#xff0c;多是忽略过去&#xff0c;此间却务真践实履。” 先生曰&#xff1…

俞敏洪用20年的经验笑谈人生:不要在穷的时候假装崇高

转载于: https://www.huxiu.com/article/174774/1.html 虎嗅注&#xff1a;本文是新东方创始人、洪泰基金联合创始人俞敏洪&#xff0c;于12月1日在麻省理工学院跟学生做的一个主题演讲&#xff0c;言辞幽默&#xff0c;充满智慧&#xff0c;有太多人生的道理。本文由微信公众号…

每日言论:『模仿他人是人生陷阱』

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; 最近&#xff0c;我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神&#xff0c;有兴趣的同学可以加入和我们一起交流技术&#xff0c;在 「奇妙的 Linux 世界」 公…

38岁,外企技术经理,失业:职场遇到瓶颈,你可能掉进了“能力陷阱”!

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 一位读者小R&#xff0c;给我讲述了他的职场经历。 小R&#xff0c;2008年通信专业硕士毕业。先去了华为&#xff0c;做了1年觉得有点苦&#xff0c;就去学了1年英语&#xff0c;后来跳槽到摩托罗拉。…

复旦大学教师 于娟博士《为啥是我得癌症?》

复旦女教师于娟已经去世半年多了&#xff0c;但这篇《为啥是我得癌症&#xff1f;》值得每个人认真阅读。 于娟&#xff0c;女&#xff0c;32岁&#xff0c;祖籍山东济宁&#xff0c;海归&#xff0c;博士&#xff0c;复旦大学优秀青年教师&#xff0c;一个两岁孩子的母亲&a…

《思考致富》不应该指望不经历“暂时的失败”便能发财

目录 作者简介 经典摘录 机遇有个狡猾的习惯&#xff0c;喜欢从后门悄悄溜进来&#xff0c;往往还喜欢以灾难或暂时失败的方式乔装露面 离金矿仅有三英尺远 欲望&#xff1a;成就一切的起点&#xff08;通往致富之路的第一步&#xff09; 信念&#xff1a;在脑海里目睹并坚…

复旦女博士于娟:为啥是我得癌症?

复旦女博士于娟&#xff1a;为啥是我得癌症&#xff1f;【请所有的朋友看看此文】 复旦女教师于娟已经去世半年多了&#xff0c;但这篇《为啥是我得癌症&#xff1f;》值得每个人认真阅读。不要再瞎吃八吃、暴饮暴食、嗜荤如命&#xff0c;不要再拼命工作、天天熬夜&#xff0…

[转载]复旦女博士于娟——为啥是我得癌症? (转)

[转载]复旦女博士于娟——为啥是我得癌症? (转) (2012-07-30 13:47:00) 转载▼ 标签&#xff1a; 转载 黄帝内经之类。就此引用一段话&#xff1a; 下午5--7点酉时 肾经当令 晚上7--9点戌时 心包经当令 9-11点亥时 三焦经当令 11-1点子时 胆经当令 凌晨1--3点丑时 肝经当令 3…

38岁,外企技术经理,失业:职场遇到瓶颈,你可能掉进了“能力陷阱”

一位读者小R&#xff0c;给我讲述了他的职场经历。 小R&#xff0c;2008年通信专业硕士毕业。先去了华为&#xff0c;做了1年觉得有点苦&#xff0c;就去学了1年英语&#xff0c;后来跳槽到摩托罗拉。 呆了12年&#xff0c;自己也熬到了技术经理的岗位。其实&#xff0c;2013年…

于娟《生命日记》——复旦大学教师于娟对大学生健康的建议

下文很长&#xff0c;需要你花点耐心&#xff0c;总结只有一句&#xff1a;珍惜、享受。 “在生死临界点的时候&#xff0c;你会发现&#xff0c;任何的加班&#xff08;长期熬夜等于慢性自杀&#xff09;&#xff0c;给自己太多的压力&#xff0c;买房买车的需求&#xff0c;这…

此生未完成 --- 于娟

文章目录 图书外观好句摘录Part1 病隙日记01 “为啥是我得癌症”的非学术报告02 我的二〇一〇 Part2 人间烟火03 写给我的宝贝04 碎落在身后的时光05 远在天涯06 生为女人 Part3 唯念芳辰07 刹那芳华&#xff1a;于娟的诗 图书外观 好句摘录 Part1 病隙日记 01 “为啥是我得癌…

于娟的忠告----生命只有一次,活着才是王道啊

复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。 于娟,女,32岁,祖籍山东济宁,海归,博士,复旦大学优秀青年教师,一个两岁孩子的母亲,乳腺癌晚期患者。 2009年12月被确诊患上了乳腺癌,2010年1月2日于娟被进一步确诊乳腺癌晚期, 2011年…

于娟的忠告----生命只有一次,活着才是王道啊!!!

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 复旦女教师于娟已经去世半年多了,但这篇《为啥是我得癌症?》值得每个人认真阅读。 于…

于娟临终前的忠告(二)

复旦大学女教师于娟已经去世一年多了&#xff0c;但这篇《为啥是我得癌症&#xff1f;》值得每个人认真阅读。 于娟&#xff0c;女&#xff0c;32岁&#xff0c;祖籍山东济宁&#xff0c;海归&#xff0c;博士&#xff0c;复旦大学优秀青年教师&#xff0c;一个两岁孩子的母亲&…

inode和软硬链接

文章目录&#xff1a; 一、理解文件系统1.1 什么是inode1.2 磁盘了解1.2.1磁盘的硬件结构1.2.2 磁盘的分区1.2.3 EXT2文件系统 二、软硬链接2.1 软链接2.2 硬链接 一、理解文件系统 1.1 什么是inode inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一…

服务器inode满了怎样删除文件,inode满了

inode满了 内容精选 换一换 可能原因:客户端缓冲区(output buffer)占用过多的内存空间。解决方案:Redis-cli客户端连接实例后,执行大key扫描命令:redis-cli --bigkeys,然后执行info,查看output buffer占用情况。 系统每30秒周期性检测磁盘Inode使用率,并把实际Inode使用…

一、Inode

文章目录 一、Inode概述1.1、文件数据包括元信息与实际数据1.2、inode的特殊作用1.3、Linux系统文件三个主要的时间属性1.4、目录文件的结构1.5、inode的号码 二、inode的大小三、链接文件四、恢复EXT类型的文件五、恢复XFS类型的文件xfsdump命令格式六、xfsdump使用限制七、日…