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
私はこのようにしてやった:
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
GNU makeは、すべてのグローバル変数の名前を保持する 。VARIABLES を提供します。ただし、これには組み込み変数(MAKEFLAGS
など)が含まれます。組み込み変数を除外する必要がある場合は、次のようなフィルタリングが必要になる場合があります。次のmakefileは、info
を使用してユーザー定義変数(CUR-DIR
、LOG-DIR
)を出力します。
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
はシステムの組み込み変数であると思われるため、CURDIR
をCUR-DIR
に名前変更しました)
凝縮された@Ise Wisteriaのおかげで、これはすべての変数を示し、複数のメイクファイル(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))))
_
素晴らしいアイデアをくれた@kevinfに感謝します。 .VARIABLE自体が変数リストに出力されないように、小さな変更をお勧めします。
$(foreach v, $(filter-out .VARIABLES,$(.VARIABLES)), $(info $(v) = $($(v))))
Foreachソリューションの@kevinfに感謝します-このリストを多少機械可読なファイルとしてエクスポートしたい場合、Makeは引用できないため、echoまたはprintfを使用するときに不均一な引用または改行で苦労しますデータを正しく-無効な構文について文句を言うsh/bashを避けるために、$(file ...)関数を使用してデータを書き込む必要があります。たとえば、ルールでこれを使用します。変数名、定義、および展開された値を出力します。
_$(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),) \
)
_
(これにより、2つの変数から二重改行を持つ悪意のある変数を常に区別することができなくなります。このため、$(file >> NAME,TEXT)
内の各コンマの直後に、Makefileで生成された各改行の前に十分に一意のセパレーターを追加します)
MAKEFILE_ENV_FILEをファイル名に設定します。例:
_MAKEFILE_ENV_FILE := $(abspath $(lastword $(MAKEFILE_LIST))).env
_