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)
(我改名CURDIR为CUR-DIR因为CURDIR似乎是我系统中的内置变量)
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)
这也是可行的,而无需保存所有内容.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.
可以替换file为environment或command line打印各种变量。