运行make时如何列出Makefile中所有变量(也称为宏)的当前值?
E.g。如果这是在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
答案 0 :(得分:35)
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
似乎是内置的
我系统中的变量)
答案 1 :(得分:25)
我最终这样做了:
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
答案 2 :(得分:22)
感谢@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))))
答案 3 :(得分:0)
感谢@kevinf的好主意。我建议稍作更改,以防止.VARIABLE本身在变量列表中打印出来:
$(foreach v, $(filter-out .VARIABLES,$(.VARIABLES)), $(info $(v) = $($(v))))
答案 4 :(得分:0)
感谢@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
答案 5 :(得分:0)
在不保存所有.VARIABLES
并将其过滤掉的情况下也是可行的。
此外,如果在您的Makefile中修改了原始.VARIABLES
之一,则投票最多的两个答案将无法捕获。
签出$(origin)功能。此目标过滤出并打印在makefile中定义的所有变量:
print_file_vars:
$(foreach v, $(.VARIABLES), $(if $(filter file,$(origin $(v))), $(info $(v)=$($(v)))))
我只能通过这种方式获得一些多余的变量:CURDIR SHELL MAKEFILE_LIST .DEFAULT_GOAL MAKEFLAGS
。
一个人可以用file
或environment
代替command line
来打印各种变量。