私は以下を持っていますMakefile
:
$ cat Makefile
all: foo
foo: bar
@true
bar: file.txt
touch file.txt
file.txt:
@echo 'Created file.txt'
run:
@echo 'Target without dependency.'
$
を実行すると、すでに存在していてもmake
常にtouch file.txt
実行されます。なぜこれが起こるのですか?bar
依存関係が満たされている場合(つまり、存在する場合)、ターゲットが実行されるとは予想されませんfile.txt
。また、make
デフォルトでは、例で指定された最初のターゲットを正しく選択していますか?Makefile
all
ベストアンサー1
まず、makeはコマンドが実行する操作には興味がありません。コマンドが実行する操作にのみ興味があります。ただそれらをシェルに渡します。
第二に、bar
ファイルを作成したことがfile.txt
ないのでいつもnewerよりbar
ルールbar: file.txt
が一致し、touch file.txt
コマンドが実行されます。
当然、 を対象とするfile.txt
ルールに触れたり作成する必要があります。file.txt
また、makeがデフォルトでMakefileの最初のターゲット(例ではallと呼ばれる)を選択することは正しいですか?
はい。