Makefile中打印变量

在Makefile中打印变量有多种方法,以下是常用的几种方式:

  1. 使用 $(info) 函数

```makefile

示例1:直接打印

VAR = hello world

(info VAR = (VAR))

示例2:带说明的打印

(info \[DEBUG\] VAR = (VAR))

示例3:在规则外部打印(解析阶段打印)

all:

@echo "Building..."

```

  1. 使用 $(warning) 函数(带警告格式)

```makefile

VAR = test value

(warning VAR is set to: (VAR))

输出格式:Makefile:2: VAR is set to: test value

```

  1. 使用 echo 在规则中打印

```makefile

VAR = hello

ANOTHER_VAR = world

target:

@echo "VAR = $(VAR)"

@echo "ANOTHER_VAR = $(ANOTHER_VAR)"

或者不隐藏命令本身

echo "This command will be shown: $(VAR)"

```

  1. 打印所有变量(调试用)

```makefile

方法1:打印所有变量(包括内置变量)

print-%: ; @echo \* = ($*)

使用方法:make print-CC 或 make print-CFLAGS

方法2:打印所有环境变量和Makefile变量

debug:

@echo "=== Makefile Variables ==="

@(foreach V,(sort $(.VARIABLES)), \

(if (filter-out environment% default automatic, \

(origin V)),(info V=(V) ((value V)))))

方法3:简单的所有变量打印

showvars:

(foreach v, (.VARIABLES), (info (v) = ((v))))

```

  1. 打印特定变量

```makefile

在命令行中打印特定变量

.PHONY: debug

debug:

@echo "CC = $(CC)"

@echo "CFLAGS = $(CFLAGS)"

@echo "LDFLAGS = $(LDFLAGS)"

@echo "SOURCES = $(SOURCES)"

```

  1. 条件调试打印

```makefile

定义调试标志

DEBUG = 1

条件打印函数

ifdef DEBUG

define debug

(info \[DEBUG\] 1 = (1))

endef

else

define debug

endef

endif

使用

VAR1 = value1

VAR2 = value2

$(call debug,VAR1)

$(call debug,VAR2)

```

  1. 高级调试技巧

```makefile

打印变量来源信息

check-%:

@echo '\* = "($*)"'

@echo ' origin = (origin *)'

@echo ' flavor = (flavor *)'

@echo ' value = (value *)'

跟踪变量赋值过程

OLD_SHELL := $(SHELL)

SHELL = (warning Building @(if <, (from \<)))(OLD_SHELL)

```

  1. 完整示例

```makefile

Makefile示例

CC = gcc

CFLAGS = -Wall -O2

SOURCES = main.c utils.c

TARGET = app

打印变量

$(info === Build Configuration ===)

(info CC = (CC))

(info CFLAGS = (CFLAGS))

(info SOURCES = (SOURCES))

(info TARGET = (TARGET))

$(info ============================)

all: $(TARGET)

(TARGET): (SOURCES:.c=.o)

@echo "Linking $@..."

(CC) (CFLAGS) \^ -o @

用于调试的伪目标

debug:

@echo "Current variables:"

@echo " CC = $(CC)"

@echo " CFLAGS = $(CFLAGS)"

@echo " SOURCES = $(SOURCES)"

@echo " TARGET = $(TARGET)"

.PHONY: all debug

```

使用建议:

  1. 调试时:使用 make -p 可以打印所有变量和规则

  2. 快速查看:使用 make print-VARNAME

  3. 批量查看:创建 debug 目标集中打印

  4. 条件调试:使用 ifdef DEBUG 包装调试信息

  5. $(info) 在解析阶段执行,echo 在执行阶段执行

选择哪种方法取决于你的具体需求:

· 简单调试:使用 (info) 或 (warning)

· 规则内打印:使用 echo

· 详细调试:创建专门的调试目标

相关推荐
matrixmind11 分钟前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安2 分钟前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan2 分钟前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir22 分钟前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li28 分钟前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页39 分钟前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at40 分钟前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at1 小时前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at1 小时前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at1 小时前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯