6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Makefile 既存のファイルの有無で変数を設定する

Posted at

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

6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?