web-dev-qa-db-ja.com

gnu make:特定の実行におけるすべての変数(または「マクロ」)の値をリストします

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
38
johv

私はこのようにしてやった:

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
26
johv

GNU makeは、すべてのグローバル変数の名前を保持する 。VARIABLES を提供します。ただし、これには組み込み変数(MAKEFLAGSなど)が含まれます。組み込み変数を除外する必要がある場合は、次のようなフィルタリングが必要になる場合があります。次のmakefileは、infoを使用してユーザー定義変数(CUR-DIRLOG-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はシステムの組み込み変数であると思われるため、CURDIRCUR-DIRに名前変更しました)

37
Ise Wisteria

凝縮された@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))))
_
22
kevinf

素晴らしいアイデアをくれた@kevinfに感謝します。 .VARIABLE自体が変数リストに出力されないように、小さな変更をお勧めします。

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

0
WiiBopp

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
_
0
phi1010