makefileでmktempを使用する

makefileでmktempを使用する

一時ファイルを作成し、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)

関連情報