当前位置: 首页 > news >正文

Makefile基础

1. = := +=的区别

  1. =(递归展开赋值,Recursive Assignment)
    行为:变量值在使用时动态展开(延迟展开),可以引用后续定义的变量。
    特点:变量实际值在引用时才确定。
    示例:
VAR1 = hello
VAR2 = $(VAR1)   # VAR2 的值在引用时才会展开
VAR1 = world      # 修改 VAR1
all:@echo $(VAR2)   # 输出 "world"(使用的是最终的 VAR1 值)
  1. :=(立即展开赋值,Simple Assignment)
    行为:变量值在定义时立即展开,后续变量的修改不会影响已赋值的变量。
    特点:变量值在定义时即固定,无法引用后续定义的变量。
    示例:
VAR1 = hello
VAR2 := $(VAR1)  # VAR2 的值立即展开为 "hello"
VAR1 = world      # 修改 VAR1
all:@echo $(VAR2)   # 输出 "hello"(保持定义时的值)
  1. +=(追加赋值,Appending Assignment)
    行为:在现有变量值的末尾追加新内容,具体的展开规则取决于原变量的定义方式:
    若原变量用 = 定义,+= 会递归展开。
    若原变量用 := 定义,+= 会立即展开。
    示例:
#### 示例1:原变量使用 =
VAR1 = a
VAR1 += b        # 等效于 VAR1 = $(VAR1) b(递归展开)
VAR1 = c         # 覆盖之前的赋值all:@echo $(VAR1)  # 输出 "c"(覆盖生效)
示例2:原变量使用 :=
VAR2 := a
VAR2 += b         # 等效于 VAR2 := $(VAR2) b(立即展开为 "a b")
VAR2 := c         # 覆盖之前的赋值all:@echo $(VAR2)  # 输出 "c"(覆盖生效)
示例3:追加动态生成的变量
VAR3 = a
VAR3 += $(NEW)    # NEW 变量后续定义依然生效
NEW = ball:@echo $(VAR3)  # 输出 "a b"(递归展开)

核心对比总结

赋值符号展开时机引用后续变量典型场景
=使用时展开需要动态引用变量的场景
:=定义时展开需要立即固定变量值的场景
+=依赖原赋值类型依原符号规则在现有值后追加内容

内核模块 Makefile 中的应用建议
在内核模块的 Makefile 中,常见做法是:
优先使用 =:确保模块的目标文件($(DRIVER_NAME)-objs)可以灵活引用后续定义的变量。

DRIVER_NAME = axidma-mod
$(DRIVER_NAME)-objs = axi_dma.o axidma_chrdev.o  # 允许后续追加或修改
$(DRIVER_NAME)-objs += axidma_dma.o             # 追加新文件

仅必要时用 :=:当明确需要立即固定变量值时使用(如快速赋初始值)。
实验验证
可以通过以下命令快速测试变量赋值行为:

#### 编写示例 Makefile
cat > Makefile <<EOF
VAR1 = a
VAR1 += b
VAR1 = cVAR2 := a
VAR2 += b
VAR2 := call:@echo "VAR1: $(VAR1), VAR2: $(VAR2)"
EOF# 运行 make
make  # 输出: VAR1: c, VAR2: c

解析指令

DRIVER_NAME = axidma-mod
$(DRIVER_NAME)-objs = axi_dma.o axidma_chrdev.o axidma_dma.o axidma_of.o

变量语法:展开后变量名为 axidma-mod-objs。
依赖关系:
axidma-mod.ko 模块由以下目标文件(.o)构成:
axi_dma.o(主驱动逻辑)
axidma_chrdev.o(字符设备接口)
axidma_dma.o(DMA 操作相关)
axidma_of.o(设备树支持)
编译规则:
内核构建系统会自动将 .c 源码文件编译为对应的 .o 文件,并链接成 .ko 模块。

http://www.dtcms.com/a/316755.html

相关文章:

  • C/C++ 宏中 `do { ... } while (0)` 的“零次循环”技巧
  • Windows 远程管理 (WinRM)问题详解包括c#与python例子
  • vue - - - - 18n高级使用(插入变量)
  • Pycharm 2025.2 免登陆试用
  • Centos-Stream 10 安装教程(2025版图文教程)
  • [激光原理与应用-152]:光学器件 - 光栅,一种由周期性排列的等宽等间距结构组成的光学元件,通过衍射和干涉实现光的分光、调制或测量功能的光学元件
  • 详细讲述优雅草蜻蜓I即时通讯私有化中xmpp服务中的tigase的角色与作用深度分析-卓伊凡|bigniu
  • 【Istio系列--Istio基础理论和部署】
  • leetcode 104.二叉树的最大深度
  • 数据结构3-双向链表、循环链表
  • 14.Home-新鲜好物和人气推荐实现
  • 大模型|极简说清“数据并行”
  • 06-队列
  • Crawl4AI:开源的AI友好型网页爬虫与数据抓取工具
  • 电子秤利用Websocket做为Client向MES系统推送数据
  • 软件测试——接口自动化
  • STM32内部读写FLASH
  • 90、【OS】【Nuttx】【启动】栈溢出保护:配置项解析
  • Swift 实战:用队列巧解 LeetCode 346 数据流中的移动平均数
  • 服务器端口连通性的测试工具和方法
  • XXL-JOB调度中心、执行器、Job之间的关系
  • MQTT:消息详解
  • 备忘录记事本 任务清单 html
  • 基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真
  • 线性规划最优解
  • 饿了么招java开发咯
  • tarjan找SCC,缩点建DAG,找唯一源头节点
  • 强光干扰下误报率↓82%!陌讯多模态融合算法在火焰识别的落地优化
  • 不可变集合
  • nflsoi 7.31 题解