如何在运行make时列出Makefile中所有变量(也称为宏)的当前值?
例如。如果这是在Makefile中:
CUR-DIR := $(shell /bin/pwd)
LOG-DIR := $(CUR-DIR)/make-logs
然后我想告诉我:
CUR-DIR = /home/johv/src/test
LOG-DIR = /home/johv/src/test/make-logs
GNU make提供了.VARIABLES,它包含所有全局变量的名称。但是,这包括内置变量(如MAKEFLAGS
)。如果必须排除内置变量,可能需要进行以下某些过滤。以下makefile使用CUR-DIR
打印用户定义的变量(LOG-DIR
,info
):
VARS_OLD := $(.VARIABLES)
CUR-DIR := $(shell pwd)
LOG-DIR := $(CUR-DIR)/make-logs
$(foreach v, \
$(filter-out $(VARS_OLD) VARS_OLD,$(.VARIABLES)), \
$(info $(v) = $($(v))))
(我将CURDIR
重命名为CUR-DIR
,因为CURDIR
似乎是我系统中的内置变量)
我最终这样做:
gmake -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq > makevars.txt
这使:
CUR-DIR := /home/johv/src/test
LOG-DIR := /home/johv/src/test/make-logs
MAKEFILE_LIST := Makefile
MAKEFLAGS = pn
SHELL = /bin/sh
VARS_OLD := [...]
gmake -pn
真的很冗长,看起来有点像这样:
# environment
GNOME2_PATH = /usr/local:/opt/gnome:/usr:/usr/local:/opt/gnome:/usr
# automatic
@F = $(notdir $@)
# makefile
SHELL = /bin/sh
# default
RM = rm -f
感谢@Ise Wisteria,缩减,这显示了所有变量,对于具有多个makefile(Buildroot)的大型项目非常有用。
$(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))
输出:BR2_GCC_TARGET_TUNE = "cortex-a8"
......
如果你得到一个错误:insufficient number of arguments (1) to function 'addprefix'
这个项目有一些破碎的变量......我修剪了要显示的变量列表,只有前缀BR2_
$(foreach v, $(filter BR2_%,$(.VARIABLES)), $(info $(v) = $($(v))))
感谢@kevinf的好主意。我建议做一个小改动,以防止.VARIABLE本身在变量列表中打印出来:
$(foreach v, $(filter-out .VARIABLES,$(.VARIABLES)), $(info $(v) = $($(v))))
感谢@kevinf的foreach解决方案 - 如果想要将此列表导出为有点机器可读的文件,那么在使用echo或printf时,使用不均匀的引号或换行符很难,因为Make无法引用数据正确 - 需要使用$(file ...)函数来编写数据,以避免sh / bash抱怨无效语法。例如,在规则中使用它 - 它打印变量名称,定义和扩展值:
$(file > $(MAKEFILE_ENV_FILE),)
$(foreach v, $(.VARIABLES), \
$(file >> $(MAKEFILE_ENV_FILE),$(v)) \
$(file >> $(MAKEFILE_ENV_FILE), := $(value $(v))) \
$(file >> $(MAKEFILE_ENV_FILE), == $($(v))) \
$(file >> $(MAKEFILE_ENV_FILE),) \
)
(这仍然不允许始终将恶意变量与来自两个变量的双重换行区分开来,因为现在在$(file >> NAME,TEXT)
中每个逗号后面的每个Makefile生成的换行符前面添加一个足够独特的分隔符)
将MAKEFILE_ENV_FILE设置为某个文件名,例如:
MAKEFILE_ENV_FILE := $(abspath $(lastword $(MAKEFILE_LIST))).env