GNU makeの実行プロセスについて

GNU makeの実行プロセスについて

私は以下を持っています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デフォルトでは、例で指定された最初のターゲットを正しく選択していますか?Makefileall

ベストアンサー1

まず、makeはコマンドが実行する操作には興味がありません。コマンドが実行する操作にのみ興味があります。ただそれらをシェルに渡します。

第二に、barファイルを作成したことがfile.txtないのでいつもnewerよりbarルールbar: file.txtが一致し、touch file.txtコマンドが実行されます。

当然、 を対象とするfile.txtルールに触れたり作成する必要があります。file.txt

また、makeがデフォルトでMakefileの最初のターゲット(例ではallと呼ばれる)を選択することは正しいですか?

はい。

おすすめ記事