makefile 变量赋值方式

简介: makefile 变量赋值方式

前言


一、变量的定义和使用

  1. makefile 中支持程序设计语言中的变量的概念。
    makefile 中的变量 只代表文本数据 (字符串)

makefile 中的变量规则:

  • 变量名可以包含 字符,数字,下划线。
  • 不能包含 " : ", " # ", " = ", 或 " "。
  • 变量名大小写敏感。
  1. 定义使用变量:
    Makefile 中的变量是用于存储 定值或字符串 的对象。

CC := gcc 表明 定义一个变量 CC, 将它赋值为 gcc ,定义了编译器的类型。

这里的 := 就是简单的变量赋值方式,

  1. 相当于 c 语言中的=

$( ) 的作用是引用变量.

二、变量的赋值方式

不同的赋值方式意义不同。

makefile 支持 4 中变量的赋值方式。

1,简单赋值 ( := )

  • 程序设计语言的通用的赋值方式。
  • 只针对当前语句的变量有效。

例如:定义 变量 x, y ,并对其进行简单赋值。

x := foo
y := $(x)
x := new
test :
  @echo "x => $(x)"
  @echo "y => $(y)"

2,递归赋值 ( = )

  • 赋值操作可能 影响多个其他的变量
  • 所有与目标变量相关的其他变量都将收到影响。

使用递归对 x 赋值,则可能会影响其他值的变化。

x = foo
y = $(x)b
x = new
test :
  @echo "x => $(x)"
  @echo "y => $(y)"

3,条件赋值 ( ?= )

  • 如果变量未定义,使用赋值符号中的值定义变量。
  • 如果变量已经定义,则复制无效。(适用于第一次赋值

使用 条件复制 二次对 x 进行赋值,就不会改变 x 。

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

4,追加赋值 ( += )

  • 原变量值之后加上一个新值。(类似于字符串的添加)
  • 原变量值与新值之间由空格给隔开。
x := foo
y := $(x)b
x += new
test :
  @echo "x => $(x)"
  @echo "y => $(y)"

三、预定义变量

在 makefile 中存在一些预定义变量。

Makefile 中预定义变量是指由 Make 工具提前定义好的、可以直接在 Makefile 中使用的变量,这些变量包括了常见的编译和链接选项,以及 Make 工具本身的一些参数和配置信息。

1. 自动变量

Makefile 中的自动变量是指在 Make 命令执行过程中,自动生成并可供使用的特殊变量。这些变量在用于保存临时信息或函数返回值,帮助我们更好地完成规则定义和执行。

常用的自动变量:

  • $@:当前规则中触发命令被执行的 目标
  • $> : 当前规则中的所有依赖
  • $< : 当前规则中的第一个依赖
  • $*:匹配通配符(%)的部分,例如规则中的 %.c匹配了foo.c,则$* 的值为foo。
  • $?:比目标文件更新的所有依赖文件名称列表,以空格分隔。

2. 自动变量示例

示例 一:

.PHONY : all first second third     // 伪目标的声明
all : first second third
  @echo "\$$@ => $@"      // @ 可消除回显
  @echo "$$^ => $^"
  @echo "$$< => $<"
firtst:         // 没有依赖,命令,永远是最新的
second:
third:

对于 @echo " $$^ => $^ " 的命令, => 左边和右边的不同;右边即是 变量本身,左边是文本。

注意:

  • " $ " 对于makefile 有特殊的含义。输出时需要加一个 " $ " 进行转义
  • " $@ " 对于Bash Shell 有特殊的含义。输出时需要加一个 " \ " 进行转义

示例 二:

CC := g++       // 定义一个变量CC 并赋值为 g++.
TARGET := hello-world.out   // 目标
$(TARGET) : func.o main.o   // 使用定义的变量直接使用 $ 即可,TARGET 依赖于 func.o, main.o
  $(CC) -o $@ $^
func.o : func.c
  $(CC) -o $@ -c $^
main.o : main.c
  $(CC) -o $@ -c $^
.PHONY : rebuild clean all      // 伪目标的声明
rebuild : clean all       // rebuild 伪目标依赖于clean ,all
all : $(TARGET) 
clean :
  $(RM) *.o $(TARGET)     // 删除所有的 .o 和 hello-world.out文件

3. 特殊变量

一些特殊变量的含义:

  • $(MAKE):当前的 make 解释器的文件名。
  • $(MAKECMDGOALS):命令行中的目标名(make 的命令行参数)$(MAKEFILE_LIST):make 需要处理的文件列表。当前makefile 的文件名总是位于列表的最后。文件名之间以空格分割。
  • $(MAKE_VERSION ):当前的 make 解释器的版本。
  • $(CURDIR):当前工作目录的完整路径。这个变量通常用于构建绝对路径的文件名或目录名。
  • $(.VARIABLES):所有已经定义的变量列表。(预定义变量 和 自定义变量)$(RM):用于删除文件的命令,默认是 rm -f。你可以显式设置 RM 变量来指定其他的删除命令。
  • $(AR):用于创建静态库的命令,默认是 ar。你可以显式设置 AR 变量来指定其他的命令。
  • $(ARFLAGS):传递给 $(AR) 命令的选项,默认为空。你可以显式设置 ARFLAGS 变量来指定其他的选项。

4. 特殊变量示例

.PHONY : all out first second third test
all out : 
  @echo "$(MAKE)"
  @echo "$(MAKECMDGOALS)"
  @echo "$(MAKEFILE_LIST)"
first :
  @echo "first"
second :
  @echo "second"
third :
  @echo "third"
test :
  @$(MAKE) first
  @$(MAKE) second
  @$(MAKE) third

相关文章
|
存储 编译器 C语言
Makefile基础教程(变量的介绍和使用)
Makefile基础教程(变量的介绍和使用)
351 0
|
SQL
若依框架---角色与权限
若依框架---角色与权限
1000 0
|
5月前
|
存储 移动开发 Ubuntu
设置Ubuntu 22.04 LTS上的rsync同步服务
通过以上方法可以实现Ubuntu系统间基础且高效率得数据备份与共享。根据具体需求调整参数并测试以确认一切按预期工作。
326 14
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
1002 0
|
SQL 存储 运维
云端问道5期方案教学-基于 Hologres 轻量实时的高性能OLAP分析
本文介绍了基于Hologres的轻量实时高性能OLAP分析方案,涵盖OLAP典型应用场景及Hologres的核心能力。Hologres是阿里云的一站式实时数仓,支持多种数据源同步、多场景查询和丰富的生态工具。它解决了复杂OLAP场景中的技术栈复杂、需求响应慢、开发运维成本高、时效性差、生态兼容弱、业务间相互影响等难题。通过与ClickHouse对比,Hologres在性能、写入更新、主键支持等方面表现更优。文中还展示了小红书、乐元素等客户案例,验证了Hologres在实际应用中的优势,如免运维、查询快、成本节约等。
234 0
云端问道5期方案教学-基于 Hologres 轻量实时的高性能OLAP分析
|
安全 数据安全/隐私保护 API
鸿蒙开发:一文了解软键盘相关
软键盘最主要的就是合理的进行避让,不能遮挡可输入组件,再有多个输入框的时候,需要动态的进行设置高度,这一点需要注意。
245 2
鸿蒙开发:一文了解软键盘相关
|
Linux 芯片 开发者
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
1828 0
Linux 驱动开发基础知识——内核对设备树的处理与使用(十)
|
算法 安全 物联网
ECC算法详解+python实现
在了解了RSA算法的基础上,我们再学习ECC算法。
1268 1
ECC算法详解+python实现
|
存储 大数据 关系型数据库
开发大数据的正确姿势--交互式分析
在大数据技术领域里,用户通常希望获得高可靠、低延时的数据服务,来满足简单或者复杂的查询场景。本文为您深度揭秘交互式分析的核心技术以及应用场景,用交互式分析打开开发大数据的正确姿势!
3451 0