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

时间:2011-08-19 06:54:29

标签: makefile gnu-make

运行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

6 个答案:

答案 0 :(得分:35)

GNU make提供.VARIABLES 它包含所有全局变量的名称。 但是,这包括内置变量(如MAKEFLAGS)。 如果必须排除内置变量,请按以下方式进行一些过滤 可能需要。 以下makefile打印用户定义的变量(CUR-DIRLOG-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

一个人可以用fileenvironment代替command line来打印各种变量。