一時ファイルを作成し、makefileを使用していくつかのテキストをパイプしたいと思います。
Bashでは、次のように一時ファイルを作成してテキストをパイプできます。
temp_file=$(mktemp)
echo "text goes into file" > ${temp_file}
cat ${temp_file}
rm ${temp_file}
実行時出力(予想どおり):
text goes into file
makefileで同じコードを使用すると、次の結果が表示されます。
ファイル生成:
test:
temp_file=$(mktemp)
echo "text goes into file" > ${temp_file}
cat ${temp_file}
rm ${temp_file}
$make test
echo "text goes into file" > /bin/sh: -c: line 1: syntax error near
unexpected token `newline' /bin/sh: -c: line 1: `echo "text goes into
file" > ' make: *** [makefile:18: test] Error 2
私はここで何が間違っているのか知っていますか?それとも特別なメイクファイルの構文規則がありませんか?
答え1
問題は、レシピの各行が別々のシェル呼び出しで実行されるため、1行に設定されたシェル変数が後続の行に表示されないことです(参照:makefileの現在のディレクトリが変更されないのはなぜですか?)。最も重要なことは、$
シェルが見ることができるように記号を2倍にする必要があることです$
。
ただし、ここではシェル変数の代わりにMake変数を使用できます。
TEMP_FILE := $(shell mktemp)
test:
echo "text goes into file" > $(TEMP_FILE)
cat $(TEMP_FILE)
rm $(TEMP_FILE)