次の Makefile で
f = echo $(1)
t:
$(call f,"a \
b"); \
$(call f,"a \
b")
- 4 行目の先頭 (最初の呼び出し f) には、TAB が 1 つだけあります。
- 行末に空白はありません
出力は
a b
a b
2 つの呼び出しは同じです (最初の TAB を除く)。出力が異なるのはなぜですか?
出力が異なる理由に対する答えは、これが GNU Make のバックスラッシュと改行の空白の崩壊における小さなバグであると思われます。関連するコードは次のnew_job()
とおりです。
/* Discard any preceding whitespace that has
already been written to the output. */
while (out > ref
&& isblank ((unsigned char)out[-1]))
--out;
私はこのコードを知りませんが、in
とref
ポインターはロックステップで動作するため、 との比較は間違っているようですout
。ref
に置き換えるout > ref
とout > cmds->command_lines[i]
問題が修正され、コードに加えるのが完全に間違っているとは限りません。
これが GNU Make のバグであるかどうかにかかわらず、makefile がホワイトスペースの除去の気まぐれに密接に依存することは、実際には良い考えではありません。レシピで空白が本当に重要な場合は、これを防御的に次のようにコーディングできます。
f = echo $(strip $(1))
トラブルを一気に回避。