make でターゲットを実行する際に、ファイルの有無によって変数を切り替えるサンプルです。
サンプル内では「ファイル」を "A.txt" としています。
filename = A.txt
fileexists = $(shell ls | grep ${filename})
ifeq (${fileexists}, ${filename})
message = "${filename} found"
else
message = "${filename} not found"
endif
run:
@echo ${message}
touch:
@touch ${filename}
clean:
@\rm -f ${filename}
.PHONY: run touch clean help
ターゲットは以下のとおりです。
ターゲット | 実行する内容 |
---|---|
run | ファイルA.txtの有無を表示 |
touch | ファイルA.txt を作る |
clean | ファイルA.txt を削除する |
実行結果です。
$ make run
A.txt not found
$ make touch
$ make run
A.txt found
A.txt の有無に応じて設定されたmessage が表示されています。
ここで、一度、クリーンします。
$ make clean
make のターゲットを2つ続けて実行します。touch して run します。
$ make touch run
A.txt not found
touch した結果は反映されず、A.txtが存在しない場合の結果になりました。
つまり、make 実行時点でのファイルの有無によって判断されるのは要注意です。
最後に、はまったポイントを1つだけ紹介します。
2行目を以下のように記述していて、期待した動作になりませんでした。
fileexists = $(shell ls | grep $filename)
違いは、末尾の ${ filename } に{}(波括弧?)が無く、$filename になっているところです。
これが必要な理由までは分かりません…
動くようにできればOKということで m(_ _)m