316

私のメイクファイルには、変数「NDK_PROJECT_PATH」があります。私の質問は、コンパイル時にそれをどのように出力できるかということです。

「$ PATH」文字列を表示する Make file echoを読み、試しました:

@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)

どちらも私に与えます

"build-local.mk:102: *** missing separator.  Stop."

なぜそれが私のために働いていないのか誰にも分かりますか?

4

15 に答える 15

280

次のメソッドを使用して(「var」という名前の変数を使用して)makefileが読み取られるときに変数を出力できます(この質問に適切にタグを付けたGNU makeを想定):

$(info $$var is [${var}])

この構造を任意のレシピに追加して、make がシェルに渡すものを確認できます。

.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world

ここで、make はレシピ全体 ( $(info $$var is [${var}])echo Hello world) を単一の再帰的に展開された変数として格納します。make がレシピの実行を決定すると (たとえば、 build を指示した場合all)、変数を展開し、結果の各行を個別にシェルに渡します。

だから、痛いほど詳細に:

  • 伸びます$(info $$var is [${var}])echo Hello world
  • これを行うには、最初に展開します$(info $$var is [${var}])
    • $$文字どおりになる$
    • ${var}なる:-)(言う)
    • 副作用は、$var is [:-)]標準出力に表示されることです
    • だけどの展開$(info...)は空っぽ
  • メイクは残すecho Hello world
    • 最初に標準出力echo Hello worldに出力して、シェルに何を要求するかを知らせます
  • シェルHello worldは stdout に出力します。
于 2013-05-10T19:19:33.990 に答える
251

GNU Makeマニュアルに従って、また以下の回答で「bobbogo」で指摘されているように、情報/警告/エラーを使用してテキストを表示できます。

$(error   text…)
$(warning text…)
$(info    text…)

変数を印刷するには、

$(error   VAR is $(VAR))
$(warning VAR is $(VAR))
$(info    VAR is $(VAR))

「エラー」は、エラー文字列を表示した後、メイクの実行を停止します

于 2015-04-17T16:23:51.323 に答える
161

「Mr. Make投稿」より https://www.cmcrossroads.com/article/printing-value-makefile-variable

次のルールを Makefile に追加します。

print-%  : ; @echo $* = $($*)

次に、メイクファイル変数の値を知りたい場合は、次のようにします。

make print-VARIABLE

そしてそれは戻ります:

VARIABLE = the_value_of_the_variable
于 2014-09-12T22:12:53.660 に答える
50

単に出力が必要な場合は、単独で使用$(info)します。これは Makefile のどこでも行うことができ、その行が評価されると表示されます。

$(info VAR="$(VAR)")

VAR="<value of VAR>"make がその行を処理するたびに出力します。この動作は位置に大きく依存するため、変更可能なすべての処理が既に行われた後に$(info)展開が行われるようにする必要があります。$(VAR)

より一般的なオプションは、変数の値を出力するための特別なルールを作成することです。一般的に、ルールは変数が割り当てられた後に実行されるため、実際に使用されている値が表示されます。(ただし、ルールによって変数を変更することは可能です。) 適切な書式設定は、変数が何に設定されているかを明確にするのに役立ち、$(flavor)関数は変数の種類を示します。したがって、このルールでは:

print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true
  • $*% パターンがルールに一致した語幹に展開されます。
  • $($*)によって名前が与えられる変数の値に展開され$*ます。
  • [と変数の]展開を明確に描写します。"and"または類似のものを使用することもできます。
  • $(flavor $*)変数の種類を示します。注:は、その展開ではなく$(flavor) 、変数名を取ります。したがって、 と言うとmake print-LDFLAGS、 が得られます$(flavor LDFLAGS)。これはあなたが望むものです。
  • $(info text)出力を提供します。 拡張の副作用として、stdout に出力を作成しますtextしかしの展開$(info)は空です。のように考えることができますが@echo、重要なことは、シェルを使用しないため、シェルの引用規則について心配する必要がないことです。
  • @trueルールのコマンドを提供するためだけに存在します。それがなければ、 makeも を出力しますprint-blah is up to date@trueそれがノーオペレーションであることをより明確にしているように感じます。

それを実行すると、得られます

$ make print-LDFLAGS
LDFLAGS is a recursive variable set to [-L/Users/...]
于 2015-12-13T19:15:53.460 に答える
10

のすべてのバージョンでmakeは、コマンド ラインの最初の文字をタブ (スペースではなく) でインデントする必要があります。問題の 2 行だけでなく、ルール全体を示していただければ、より明確な回答を得ることができますが、次のようになります。

myTarget: myDependencies
        @echo hi

ここで、2 行目の最初の文字は TAB でなければなりません。

于 2013-05-09T23:35:43.990 に答える
3

問題は、エコーが実行ブロックの下でのみ機能することです。つまり、「xx:」以降のすべて

したがって、最初の実行ブロックより上のものは単なる初期化であるため、実行コマンドは使用できません。

実行ブロックを作成します

于 2015-12-04T17:56:56.123 に答える
-1

次のように、make ファイルに vars ルールを作成できます。

dispvar = echo $(1)=$($(1)) ; echo

.PHONY: vars
vars:
    @$(call dispvar,SOMEVAR1)
    @$(call dispvar,SOMEVAR2)

ここにすべての変数をダンプするより確実な方法がいくつかあります: gnu make: list the values of all variables (または「マクロ」) in a specific run

于 2014-12-31T00:33:14.877 に答える