パターンルールを使用して、いくつかのソースのそれぞれに対していくつかの出力ファイルを生成するメイクファイルを作成しようとしています。
私は次のものを持っていますMakefile
(GNU Make 3.8.1):
all : foo.all bar.all
%.all : %.pdf %.svg
@echo Made $*
%.pdf :
touch $@
%.svg :
touch $@
.PHONY: foo.all bar.all
*.all
は実際の出力ファイルを表していないため、 としてマークしてみました.PHONY
。ただし、実行make
しても機能しません。
$ ls
Makefile
$ make
make: Nothing to be done for `all'.
によるとmake -d
:
No implicit rule found for `all'.
Considering target file `foo.all'.
File `foo.all' does not exist.
Finished prerequisites of target file `foo.all'.
Must remake target `foo.all'.
Successfully remade target file `foo.all'.
Considering target file `bar.all'.
File `bar.all' does not exist.
Finished prerequisites of target file `bar.all'.
Must remake target `bar.all'.
Successfully remade target file `bar.all'.
Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.
make: Nothing to be done for `all'.
ルールを実行するふりをしているように見えます%.all
が、本文をスキップしています。
しかし、この.PHONY
行をコメントアウトすると、Make はターゲットを実行しますが、自発的に出力ファイルを削除することを決定します。
$ make
touch foo.pdf
touch foo.svg
Made foo
touch bar.pdf
touch bar.svg
Made bar
rm foo.pdf foo.svg bar.pdf bar.svg
によるとmake -d
、次のように書かれています。
Removing intermediate files...
最小限の例
異常な動作を示す最小限の例:
%.all: %.out
@echo Made $*
%.out:
touch $@
実行make somefile.all
するとファイルsomefile.out
が作成されると思いますが、削除されます:
$ make somefile.all
touch somefile.out
Made somefile
rm somefile.out