在Makefile中打印变量有多种方法,以下是常用的几种方式:
- 使用 $(info) 函数
```makefile
示例1:直接打印
VAR = hello world
(info VAR = (VAR))
示例2:带说明的打印
(info \[DEBUG\] VAR = (VAR))
示例3:在规则外部打印(解析阶段打印)
all:
@echo "Building..."
```
- 使用 $(warning) 函数(带警告格式)
```makefile
VAR = test value
(warning VAR is set to: (VAR))
输出格式:Makefile:2: VAR is set to: test value
```
- 使用 echo 在规则中打印
```makefile
VAR = hello
ANOTHER_VAR = world
target:
@echo "VAR = $(VAR)"
@echo "ANOTHER_VAR = $(ANOTHER_VAR)"
或者不隐藏命令本身
echo "This command will be shown: $(VAR)"
```
- 打印所有变量(调试用)
```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))))
```
- 打印特定变量
```makefile
在命令行中打印特定变量
.PHONY: debug
debug:
@echo "CC = $(CC)"
@echo "CFLAGS = $(CFLAGS)"
@echo "LDFLAGS = $(LDFLAGS)"
@echo "SOURCES = $(SOURCES)"
```
- 条件调试打印
```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)
```
- 高级调试技巧
```makefile
打印变量来源信息
check-%:
@echo '\* = "($*)"'
@echo ' origin = (origin *)'
@echo ' flavor = (flavor *)'
@echo ' value = (value *)'
跟踪变量赋值过程
OLD_SHELL := $(SHELL)
SHELL = (warning Building @(if <, (from \<)))(OLD_SHELL)
```
- 完整示例
```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
```
使用建议:
-
调试时:使用 make -p 可以打印所有变量和规则
-
快速查看:使用 make print-VARNAME
-
批量查看:创建 debug 目标集中打印
-
条件调试:使用 ifdef DEBUG 包装调试信息
-
$(info) 在解析阶段执行,echo 在执行阶段执行
选择哪种方法取决于你的具体需求:
· 简单调试:使用 (info) 或 (warning)
· 规则内打印:使用 echo
· 详细调试:创建专门的调试目标