GNUmakefile で、一時ディレクトリを使用するルールを設定したいと思います。例:
out.tar: TMP := $(shell mktemp -d)
echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
上記のルールは、ルールが解析された時点で一時ディレクトリを作成します。つまり、out.tar を常に作成していなくても、多くの一時ディレクトリが作成されるということです。/tmp に未使用の一時ディレクトリが散らばるのを避けたいのです。
変数が定義されるたびに定義されるのではなく、ルールが実行されるときにのみ変数が定義されるようにする方法はありますか?
私の主な考えは、mktemp と tar をシェル スクリプトにダンプすることですが、それはやや見苦しいようです。
ベストアンサー1
この例では、のルールTMP
が評価されるたびに変数が設定され (一時ディレクトリが作成され) ます。 が実際に実行されるときにのみディレクトリを作成するには、ディレクトリの作成を以下の手順に移動する必要があります。out.tar
out.tar
out.tar :
$(eval TMP := $(shell mktemp -d))
@echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
の評価関数は、文字列を手動で makefile に入力したかのように評価します。この場合、変数は関数呼び出しTMP
の結果に設定されますshell
。
編集(コメントへの返信):
一意の変数を作成するには、次の操作を実行します。
out.tar :
$(eval $@_TMP := $(shell mktemp -d))
@echo hi $($@_TMP)/hi.txt
tar -C $($@_TMP) cf $@ .
rm -rf $($@_TMP)
これにより、ターゲットの名前 (この場合は out.tar) が変数の先頭に追加され、 という名前の変数が生成されますout.tar_TMP
。これで競合を防ぐのに十分であると考えられます。