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

joh*_*ohv 38 makefile gnu-make

如何在运行make时列出Makefile中所有变量(也称为宏)的当前值?

例如,如果这是在Makefile中:

CUR-DIR := $(shell /bin/pwd)
LOG-DIR := $(CUR-DIR)/make-logs
Run Code Online (Sandbox Code Playgroud)

然后我想告诉我:

CUR-DIR = /home/johv/src/test
LOG-DIR = /home/johv/src/test/make-logs
Run Code Online (Sandbox Code Playgroud)

Ise*_*ria 38

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))))
Run Code Online (Sandbox Code Playgroud)

(我改名CURDIRCUR-DIR因为CURDIR似乎是我系统中的内置变量)

  • 抱歉,我忘了提及,如果您的 GNU make 版本是 3.80 或更低,则此答案不起作用。 (2认同)
  • @JasonS,让你的shell处理它.`make> variables.txt` (2认同)

joh*_*ohv 26

我最终这样做:

gmake -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | sort | uniq > makevars.txt
Run Code Online (Sandbox Code Playgroud)

这使:

CUR-DIR := /home/johv/src/test
LOG-DIR := /home/johv/src/test/make-logs
MAKEFILE_LIST :=  Makefile
MAKEFLAGS = pn
SHELL = /bin/sh
VARS_OLD := [...]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


kev*_*inf 25

感谢@Ise Wisteria,缩减,这显示了所有变量,对于具有多个makefile(Buildroot)的大型项目非常有用.

$(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))
Run Code Online (Sandbox Code Playgroud)

输出:BR2_GCC_TARGET_TUNE = "cortex-a8"...

如果你得到一个错误:insufficient number of arguments (1) to function 'addprefix'这个项目有一些破碎的变量......我修剪了要显示的变量列表,只有前缀BR2_

$(foreach v, $(filter BR2_%,$(.VARIABLES)), $(info $(v) = $($(v))))
Run Code Online (Sandbox Code Playgroud)


Vic*_*nko 6

这也是可行的,而无需保存所有内容.VARIABLES并将其过滤掉。

此外,如果.VARIABLES在您的 makefile 中修改了原始文件之一,则投票最多的两个答案将无法捕捉到它。

查看$(origin)函数。此目标过滤并打印在 makefile 中定义的所有变量:

print_file_vars:
    $(foreach v, $(.VARIABLES), $(if $(filter file,$(origin $(v))), $(info $(v)=$($(v)))))
Run Code Online (Sandbox Code Playgroud)

这样我只得到了一些多余的变量:CURDIR SHELL MAKEFILE_LIST .DEFAULT_GOAL MAKEFLAGS.

可以替换fileenvironmentcommand line打印各种变量。