GNU Make を使用してルール外の変数を表示することは可能ですか?
次の Makefile を検討してください。
x = foo bar baz
ifdef x
@echo $(x)
endif
その結果、Makefile:4: *** commands commence before first target. Stop.
ただし、ルールを追加すると機能します。
x = foo bar baz
ifdef x
t:
@echo $(x)
endif
デバッグなどのために変数を出力するためのルールを追加する必要は本当にあるのでしょうか?
ボーナス:
を削除するとifdef
になるのはなぜですかMakefile:3: *** missing separator. Stop.
?
x = foo bar baz
@echo $(x)
答え1
うーん、可能だけど役に立たない。
Makefile はシェル スクリプトとは異なることを理解する必要があります。Makefile はターゲットと、そのターゲットを作成するために実行する必要がある内容を指定します。そのことを念頭に置くと、Makefile での誤ったコマンドの実行は概念的な問題になります。そのコマンドはいつ実行されるのでしょうか。そのコマンドをトリガーするターゲットは存在しません。
あなたは出来る:
MY_VAR := $(shell ls)
all:
@echo MY_VAR IS $(MY_VAR)
GNU を想定していることに注意してくださいmake
。これは を実行しls
、出力を に入れますMY_VAR
。しかし、これは避けるべきハックです。
追加のターゲットを試すこともできます
extra:
@echo $(x)
そして、それを他のすべてのターゲットの前提条件として追加します。
ボーナスとして、これは行に@echo $(x)
区切り文字がないためです。ファイルのこの時点では、make
ターゲットに が期待されますが:
、その行には がありません:
。(もちろん、新しい変数の割り当てなど、他の可能性もあります)
答え2
GNU make
にはまさにそれを実行する機能があり、 と呼ばれます$(info ....)
。
次の行を a の外側に置くrule
と、GNU make がそれを実行します。
$(info variable x = $x))
そして、このようなタスクを繰り返し実行する必要がある場合は、それを で抽象化しmacro
、必要なときにいつでも呼び出すことができます。
make -f - <<\eof
dumpvar = $(info variable `$1' value is >>>$($1)<<<)
ssl_enable = NO
$(call dumpvar,ssl_enable)
.PHONY: all
all:;@:
eof
stout では次のように表示されます。
variable `ssl_enable' value is >>>NO<<<