makefile 变量赋值方式

前言


一、变量的定义和使用

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

makefile 中的变量规则:

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

在这里插入图片描述


总结

下一节介绍 变量的进阶。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
makefile 实例分析 Makefile 语法分析 第一部分 VERSION = 2# 给变量VERSION赋值 PATCHLEVEL = 6# 给变量PATCHLEVEL赋值 SUBLEVEL = 22# 给变量SUBLEVEL赋值 EXTRAVERSION = .6# 给变量EXTRAVERSION赋值 NAME = Holy Dancing Manatees, Batman!# 给变量NAME赋值 # *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file. # Do not:# o use make's built-in rules and variables#    (this increases performance and avoid hard-to-debug behavour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory# 操作符“+=”的作用是给变量(“+=”前面的MAKEFLAGS)追加值。# 如果变量(“+=”前面的MAKEFLAGS)之前没有定义过,那么,“+=”会自动变成“=”;# 如果前面有变量(“+=”前面的MAKEFLAGS)定义,那么“+=”会继承于前次操作的赋值符;# 如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符# 在执行make时的命令行选项参数被通过变量 “MAKEFLAGS”传递给子目录下的make程序。# 对于这个变量除非使用指示符“unexport”对它们进行声明,它们在整个make的执行过程中始终被自动的传递给所有的子make。# 还有个特殊变量SHELL与MAKEFLAGS一样,默认情况(没有用“unexport”声明)下在整个make的执行过程中被自动的传递给所有的子make。
Makefile脚本中,变量赋值可以通过使用等号(=)或冒号等号(:=)来完成。等号赋值是简单的赋值操作,而冒号等号赋值是递归赋值,它会在赋值时展开变量的引用。例如,变量赋值可以如下所示: ``` VAR = value ``` 或者 ``` VAR := value ``` 其中,VAR是变量名,value是要赋给变量的值。等号赋值会在使用变量时才进行展开,而冒号等号赋值会在赋值时就展开变量的引用。 此外,还可以使用自动变量、预定义变量和环境变量赋值。自动变量是在每个规则中自动生成的变量,例如$@表示目标文件名,$^表示所有依赖文件名。预定义变量是由Make工具提前定义好的变量,可以直接在Makefile中使用,例如CFLAGS表示编译选项。环境变量是系统的环境变量,可以通过export关键字将其传递到Makefile中。 总结起来,Makefile脚本中的变量赋值可以使用等号或冒号等号进行简单赋值或递归赋值,还可以使用自动变量、预定义变量和环境变量赋值。 #### 引用[.reference_title] - *1* *3* [Makefile命令与变量](https://blog.csdn.net/Suffocatingg/article/details/127922649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [makefile 变量赋值方式](https://blog.csdn.net/wuyiyu_/article/details/130555532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果罐子♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值