5

パターンルールを使用して、いくつかのソースのそれぞれに対していくつかの出力ファイルを生成するメイクファイルを作成しようとしています。

私は次のものを持っています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
4

2 に答える 2

2

somefile.outファイルはGNU makeによって中間と見なされるため、例では自動的に削除されます。.PRECIOUS次のように、特別なターゲットを使用して、GNU make にこれらのファイルを保存するように指示できます。

%.all: %.out
    @echo Made $*

%.out:
    touch $@

.PRECIOUS: %.out
于 2013-11-10T01:35:07.757 に答える