gnu make:列出特定运行中所有变量(或“宏”)的值

问题描述 投票:34回答:5

如何在运行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
makefile gnu-make
5个回答
36
投票

GNU make提供了.VARIABLES,它包含所有全局变量的名称。但是,这包括内置变量(如MAKEFLAGS)。如果必须排除内置变量,可能需要进行以下某些过滤。以下makefile使用CUR-DIR打印用户定义的变量(LOG-DIRinfo):

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似乎是我系统中的内置变量)


26
投票

我最终这样做:

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

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))))

0
投票

感谢@kevinf的好主意。我建议做一个小改动,以防止.VARIABLE本身在变量列表中打印出来:

$(foreach v, $(filter-out .VARIABLES,$(.VARIABLES)), $(info $(v) = $($(v))))


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
© www.soinside.com 2019 - 2024. All rights reserved.