makefile 变量赋值方式

news/2025/1/15 23:41:44/

文章目录

  • 前言
  • 一、变量的定义和使用
  • 二、变量的赋值方式
      • 1,简单赋值 ( := )
      • 2,递归赋值 ( = )
      • 3,条件赋值 ( ?= )
      • 4,追加赋值 ( += )
  • 三、预定义变量
      • 1. 自动变量
      • 2. 自动变量示例
      • 3. 特殊变量
      • 4. 特殊变量示例
  • 总结

前言


一、变量的定义和使用

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

makefile 中的变量规则:

  • 变量名可以包含 字符,数字,下划线。
  • 不能包含 " : ", " # ", " = ", 或 " "。
  • 变量名大小写敏感。
  1. 定义使用变量:
    Makefile 中的变量是用于存储 特定值或字符串 的对象。
    在这里插入图片描述
    CC := gcc 表明 定义一个变量 CC, 将它赋值为 gcc ,定义了编译器的类型。
    这里的 := 就是简单的变量赋值方式,相当于 c 语言中的=

在这里插入图片描述
$( ) 的作用是引用变量.

二、变量的赋值方式

不同的赋值方式意义不同。
makefile 支持 4 中变量的赋值方式。

1,简单赋值 ( := )

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

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

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

在这里插入图片描述

2,递归赋值 ( = )

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

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

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

在这里插入图片描述

3,条件赋值 ( ?= )

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

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

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

在这里插入图片描述

4,追加赋值 ( += )

  • 原变量值之后加上一个新值。(类似于字符串的添加)
  • 原变量值与新值之间由空格给隔开。
x := foo
y := $(x)b
x += newtest :@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 ,allall : $(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 testall out : @echo "$(MAKE)"@echo "$(MAKECMDGOALS)"@echo "$(MAKEFILE_LIST)"first :@echo "first"second :@echo "second"third :@echo "third"test :@$(MAKE) first@$(MAKE) second@$(MAKE) third

在这里插入图片描述


总结

下一节介绍 变量的进阶。


http://www.ppmy.cn/news/62925.html

相关文章

哨兵模式(全自动切换主从复制的老大)

主从复制会遇见一个问题&#xff0c;那就是如果主机死掉了&#xff0c;其余的从机无法进行存入数据&#xff0c;必须人工手动切换主机&#xff0c;这样很麻烦&#xff08;懒人是科技进步的第一梯队&#xff09;&#xff0c;出现了哨兵模式。 就是定义一个线程&#xff0c;每隔…

Python 中 随机数 random库 学习与使用

python中的随机数应用大体包含&#xff0c;随机整数、随机浮点数 和 获取随机数序列三类。 一. 随机整数 1.1 随机整数&#xff0c;包含上下限&#xff08;闭区间&#xff09; randint(a, b)&#xff1a;随机选取 [a, b] 之间的一个整数&#xff0c;随机整数包含a 和 b&#…

一键docker搭建mysql主从环境

一键docker搭建mysql主从环境 初衷准备阶段操作阶段注意事项 初衷 一开始为了玩一下shared-jdbc&#xff0c;要搭Mysql主从环境&#xff0c;这玩意虽然搭好&#xff0c;之后使用要是网络问题&#xff0c;或者sql执行出错&#xff0c;还得重新调Binlog位置&#xff0c;麻烦得很…

为什么选择云计算

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

计算机体系结构总结:内存一致性模型 Memory consistency Model

存储一致性是为了保证多线程背景下的访存顺序&#xff0c;多线程的语句是可以交错执行&#xff0c;使得顺序不同产生不同的执行结果。 下面P2的输出结果可能是什么&#xff1f; P1, P2两个线程的语句是可以交叉执行的&#xff0c;比如1a, 2a, 2b, 1b&#xff1b;一个线程内的语…

如何使用 Python+selenium 进行 web 自动化测试?

使用Pythonselenium进行web自动化测试主要分为以下步骤&#xff1a; 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;共计16条…

react antdesign中的Form.list的默认值问题解决方法

主要讲添加和编辑用同一个Form.list表单&#xff0c;来回切换并且改变此表单的默认展示几项 相信大家用过antdesign中的Form.list时候都会遇到一个问题吧&#xff0c;就是怎么默认值显示一项&#xff1f; 然后再网上也搜了很多方法&#xff0c;结果还是没有达到自己想要的效果…

【Java】面试常问知识点(数据库相关知识)

Redis Redis数据结构&#xff0c;跳表如何实现&#xff1f;跳表添加层级的时机&#xff1f; 布隆过滤器的底层原理 Redis数据结构 有5中数据结构&#xff0c;string&#xff08;字符串类型&#xff09;、list&#xff08;列表类型&#xff09;、hash&#xff08;哈希表类型…