[解決済み】ルール実行時にmake変数を定義する。
2022-04-06 16:54:30
質問
GNUmakefileに、一時ディレクトリを使用するルールを設けたいと思います。 たとえば、以下のようなものです。
out.tar: TMP := $(shell mktemp -d)
echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
書かれているように、上記のルールは、一時ディレクトリを作成した時点で、そのルールが パースされる . これでは、いつもout.tarを作っているわけでもないのに、たくさんの一時ディレクトリが作られてしまいます。 tmpに未使用の一時ディレクトリが散乱するのは避けたいところです。
変数が定義されたときだけでなく、ルールが実行されたときにも定義されるようにする方法はありますか?
主に考えているのは、mktempとtarをシェルスクリプトにダンプすることですが、それはやや見苦しいような気がします。
解決方法は?
あなたの例では
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
. うまくいけば、これでコンフリクトを防ぐことができます。
関連
-
[解決済み】コマンドラインからmakeに追加の変数を渡す場合
-
[解決済み] make clean、make clobber、make distclean、make mrproper、make realcleanの違いは何ですか?
-
[解決済み] デバッグとリリースのビルドを行うためのmakefileを設定するにはどうすればよいですか?
-
[解決済み] Makefile での .PHONY の使用方法
-
[解決済み] makeファイルの@!の意味は?
-
[解決済み] GNU Makefile の変数割り当て =, ?=, :=, += の違いは何ですか?
-
[解決済み] "make run "への引数の渡し方
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
-
[解決済み】Windowsで "make "をインストールして使うには?
-
[解決済み】Makeでレシピ行の接頭辞として@、-、+がありますが、これは何でしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜmakeはターゲットが最新だと思うのですか?
-
[解決済み] CygwinでのMakefile
-
[解決済み] GNU make で "commands commence before first target" エラーが発生する。
-
undefinedmakefile *** セパレータがありません。
-
[解決済み] makefileでLDFLAGSを使用する方法
-
[解決済み] makefile の記号 $@ と $< はどういう意味ですか?
-
[解決済み】makefileに'cd'コマンドを記述するには?
-
[解決済み】MakefileのターゲットでBash構文を使用するにはどうすればいいですか?
-
[解決済み】makefileでターゲットのリストを取得する方法とは?
-
[解決済み] makefile での複数行の bash コマンド