0

私はGNU makeを試していました。次の構造を持つ 3 つの C ファイルがあるとします。

hellomake.c
    |
    |---------------------
    |                    |
    V                    V
hellofunc.c         hellomake.h

メイクファイル:

hellomake: hellomake.c hellofunc.c
    gcc -o hellomake hellomake.c hellofunc.c -I.

初めて make と入力すると、プログラムが作成されますhellomake。2回目に実行すると、次のように出力されます。

make: `hellomake' is up to date.

すべてが正しく機能しています。

LaTeX ファイルのコンパイルに make を使用しようとしました。2 つの TeX ファイルがあるとします。

  1.tex
    |
    V
1_data.tex

1_data は 1.tex に内部的に含まれています。

メイクファイル:

COMMAND = pdflatex

all: 1.tex 1_data.tex
    $(COMMAND) 1.tex

しかし、入力するたびに 1.tex を再コンパイルしmakeます。どのファイルも変更されていない場合でも。

どうしたの?

4

1 に答える 1

2

makeall存在するかどうかを調べるだけです。そうでないので、それを作成しようとします (ただし、コマンドがファイルを作成していないことにさえ気づきません!)

pdflatex実際にどこかにファイルを作成すると仮定して、ファイル名をターゲット名として使用します。その後、依存関係よりも古い場合にのみ再作成されます。

要約すると、Makefile は、ターゲット ファイルのマッピング、それらの依存関係、および依存関係からそれらを作成する方法を宣言します。ターゲットが欠落しているか、依存関係に関して古くなっている場合、Make はそれを再作成するためのコマンドを実行します。

(この回答を明確にするための私の最初の試みは.PHONY:、余談としてターゲットを言及しましたが、それはこのコンテキストではあまり役に立ちません。.PHONY: all名前の付いたファイルがall存在する場合でもレシピを実行すると宣言した場合、それは探しているものとは逆の動作です。 )

于 2013-04-27T20:08:15.640 に答える