1

これは単純な Makefile です。

FILENAME=test.`date +"%Y.%m.%d %H:%M:%S"`.txt
test:
    @echo ${FILENAME}
    @sleep 2s
    @echo ${FILENAME}

の出力make test

test.2013.02.18 15:30:23.txt
test.2013.02.18 15:30:25.txt

問題は、FILENAMEそれが使用されるたびに計算されていることです。一度だけ計算し、スクリプトの実行中は同じにしたい。私はそれを間違っていますか?

4

1 に答える 1

4

GNU Make には 2 種類の変数があります。再帰的に展開された変数を使用しましたが、単純に展開された変数が必要です。http://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavorsを参照してください

現在の Makefile では、変数には正確なテキストが含まれており、参照するたびにそのテキストが逐語的に置換されるため、Makefile は次のようになります。test.date +"%Y.%m.%d %H:%M:%S".txt

test:
    @echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt
    @sleep 2s
    @echo test.`date +"%Y.%m.%d %H:%M:%S"`.txt

このように見ると、シェルがdateコマンドを 2 回実行していることは明らかです。

必要な動作を得るには、単純に展開された変数を設定する必要があり、それを定義した場所でシェル コマンドを実行する必要があります。バッククォートはシェルのメタ文字であるため使用できませんが、Make はそれらを無視するため、代わりにMake のshell関数を使用します。

FILENAME := test.$(shell date +"%Y.%m.%d %H:%M:%S").txt
于 2013-02-18T15:12:51.320 に答える