GNU Make を使用してルール外の変数を表示することは可能ですか?

GNU Make を使用してルール外の変数を表示することは可能ですか?

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

関連情報