1

この小さな Makefile を検討してください。

test:   var ?= foo

test:
        echo $(var)

make のドキュメントには、?=以前に割り当てられていない (未定義) 変数を割り当てると書かれています。ただし、コマンドライン経由で割り当てた場合:

make var=1234

の代わりに、いくつかのランダムな (ASCII、非 ASCII、空白のみ) 文字1234が端末に出力されます。=代わりに使用する?=と期待どおりに機能しますが、呼び出し元の make からエクスポートされた割り当てを「継承」してオーバーライドするため、私の場合は使用できません。また、ターゲットベースではなくグローバルな割り当てを使用しない場合、出力は期待どおりです。これらの文字シーケンスはどこから来たのですか?

Linux gentoo (GNU make v3.82) および deb-wheezy (GNU make v3.81) でテスト済み。

ヒントをありがとう!

4

2 に答える 2

0

varこの問題は GNU Make 3.81 で再現できますが、コマンド ラインで設定した場合にのみ発生することに注意してください(makeの用語によると)。varの値が環境から来ている場合、たとえば次のコマンドを使用します。

var=1234 make test

その後、すべて正常に動作します。これは、私には make のバグのような匂いがします。特に、次の定式化 (マニュアルのセクション 6.5 および 6.11 の理解によると、元の Makefile と同等である必要があります) を考えると:

test: var:=$(if $(findstring undefined,$(origin var)),foo,$(var))

test:
        echo $(var)

あらゆる状況でうまく機能します。

于 2013-01-02T17:27:36.237 に答える