makefile 变量的替换,嵌套引用,命令行变量

简介: makefile 变量的替换,嵌套引用,命令行变量

前言


一、变量替换:

1. 变量值的替换。

使用 指定的字符(串)替换变量值中的后缀字符(串)

语法格式: $(var:a=b) 或 ${var:a=b}

  • 替换表达式中不能有任何的空格。
  • make 中支持使用 ${ } 对变量进行取值。

示例 :

src1 := a.c b.c c.c
obj1 := $(src1:c=o)
test:
  @echo "obj1 => $(obj1)"

2. 变量的模式替换。

使用 % 保留变量值中的指定字符,替换其他字符。

语法格式: $(var:a%b=x%y) 或 ${var:a%b=x%y}

  • 替换表达式中不能有任何空格。
  • make 中支持 使用 $ { } 对变量进行取值。

示例 :

src1 := a1b.c  a2b.c  a3b.c
obj1 := $(src1:a%b=x%y) 
test1:
  @echo "obj1 => $(obj1)"
src2 := a11b.c  a22b.c  a33b.c
obj2 := $(src2:a%b=x%y) 
test2:
  @echo "obj2 => $(obj2)"

3. 规则中的模式替换。

表示,target-patterntarget 中匹配子目标;再通过 prereq-pattern 从子目标生成依赖; 进而构成完整的规则。

流程图

示例 :

CC := g++             # 变量的简单赋值
TARGET := hello-makefile.out
OBJS := func.o main.o const.o
$(TARGET) : $(OBJS)
  $(CC) -o $@ $^
$(OBJS) : %.o : %.c         # 采用规则中的模式替换
  $(CC) -o $@ -c $^
.PHONY : rebuild clean all      # 声明伪目标
rebuild : clean all
all : $(TARGET)
clean :
  $(RM) *.o $(TARGET)         # $(RM):用于删除文件的命令

  • 提问 : 为什莫使用 规则中的模式替换呢?

因为工程中我们的 .c .o 文件非常多。如果 想要将 .c 编译成 .o 文件时,

可以使用 这种替换方法。 直接将 文件 加在下面的 第一行后即可。

OBJS  := func.o main.o const.o

$(OBJS) : %.o : %.c

$(CC) -o $@ -c $^

这样可以很快的完成编译,减少工作量。

二、变量的嵌套使用

一个变量名之 可以包含对其他变量的引用

嵌套引用的本质是使用一个变量表示另一个变量。

x := y
y := z
a := $($(x))
test :
  @echo " a => $(a)"

需要注意的是,在变量值的嵌套引用中,Makefile 的解析顺序是从内而外的,即先解析内部的变量,再逐级向外解析外部的变量。

三、命令行变量

在 Makefile 中,可以使用命令行变量来传递参数给 Make 命令。

命令行变量可以在命令行中通过 “-变量名=变量值” 的方式定义,并在 Makefile 中使用 $(变量名) 的方式引用。

  • 运行 make 时,在命令行定义变量
  • 命令行变量默认 覆盖 makefile 中定义的变量。
hm := hello
test :
  @echo " hm => $(hm)"    # 在命令行改变其值
  @echo " new =>$(new)"   # 打印未定义的变量,在命令行定义赋值

四、override ,define 关键字

  1. override 关键字:
  • 用于指示 makefile 中定义的变量不能被覆盖
  • 变量的定义和赋值都需要使用 override 关键字。
override hm := hello
test :
  @echo " hm => $(hm)"    # 在命令行改变其值

  1. define 关键字:
  • 用于在 makefile 中定义多行变量
  • 多行变量的定义从变量名开始 到 endef结束
  • 可使用 override 关键字防止变量被覆盖。
  • define 定义的变量等价于使用 = 定义的变量。
define fool 
I'm fool!
endef
override define cmd       # 使用 override 防止变量被覆盖
  @echo "run cmd ls ..."
  @ls
endef
test :
  @echo "f00 => $(fool)"
  $(cmd)        # 调用 cmd 变量


总结

下一篇 介绍 makefile 的全局变量,文件变量,局部变量。

相关文章
|
Linux Go SoC
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
813 0
|
存储 缓存 监控
安谋科技(Arm China)马闯:Arm架构下性能分析与优化介绍
2023年9月19日,系列课程第九节《Arm®架构下性能分析与优化介绍》正式上线,由安谋科技 (Arm China)主任工程师马闯主讲,内容涵盖:Arm架构下性能监控单元 (PMU) 介绍、Arm统计性能分析扩展 (SPE) 介绍、Arm性能分析工具介绍、Arm架构下性能优化案例分享,本期节目在阿里云官网、阿里云微信视频号、阿里云钉钉视频号、InfoQ官网、阿里云开发者微信视频号、阿里云创新中心直播平台 & 微信视频号同步播出,同时可以点击【https://developer.aliyun.com/topic/ecs-yitian】进入【倚天实例迁移课程官网】了解更多内容。
|
Linux 数据安全/隐私保护 Windows
Linux vsFTPd服务详解——本地用户登录实战
Linux vsFTPd服务详解——本地用户登录实战
473 2
|
Linux 编译器 C语言
Linux应用开发基础知识——Makefile 的使用(二)
Linux应用开发基础知识——Makefile 的使用(二)
714 0
Linux应用开发基础知识——Makefile 的使用(二)
|
人工智能 监控 机器人
【Valgrind】如何使用Valgrind监控内存
【Valgrind】如何使用Valgrind监控内存
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
262627 0
|
5月前
|
开发工具 git
使用Git下载指定版本或指定commit
使用Git下载指定版本或指定commit
|
存储 Linux Shell
【Linux】—— 进程的环境变量
【Linux】—— 进程的环境变量
562 0
【Linux】—— 进程的环境变量
|
Web App开发 安全 Java
Debian 12.7 推出安全性和稳定性改进
【10月更文挑战第16天】
594 3
Debian 12.7 推出安全性和稳定性改进
|
关系型数据库 MySQL 数据安全/隐私保护
MySql-8.0.27-winx64安装,超详细
MySql-8.0.27-winx64安装,超详细
572 0

热门文章

最新文章