2011-08-19 5 views
27

makeを実行すると、すべての変数(マクロとも呼ばれます)の現在の値をMakefileにリストする方法を教えてください。gnu make:特定の実行ですべての変数(またはマクロ)の値を表示します

など。これは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 

答えて

22

私はこのようにそれをやった:

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が本当に冗長で、ちょっと次のようになります。ダウン凝縮@Ise藤へ

# environment 
GNOME2_PATH = /usr/local:/opt/gnome:/usr:/usr/local:/opt/gnome:/usr 
# automatic 
@F = $(notdir [email protected]) 
# makefile 
SHELL = /bin/sh 
# default 
RM = rm -f 
+0

'sort | uniq'は 'sort -u'です –

29

GNUは、すべてのグローバル変数の名前を保持している.VARIABLES を提供します。 ただし、これには組み込み変数(MAKEFLAGSなど)が含まれます。 組み込み変数を除外する必要がある場合は、次のようなフィルタリングが必要です( )。 次のメイクファイルを印刷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が私のシステムでは、内蔵 変数のようですので、私はCUR-DIRCURDIRに改称)

+0

どうすれば実行できますか? – johv

+0

あなたのGNU makeのバージョンが3.80以下ならば、忘れてしまいました。 この答えはうまくいかない。 –

+0

ああ、私は3.80を使用しました。 3.81でそれは働いた。また、質問のCUR-DIRに変更しました。 – johv

15

おかげで、これは複数の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)))) 
関連する問題