1

次のメイクファイルでは、依存関係が変更されているかどうかに関係なく、ターゲットの「コンパイル」が毎回実行されます。ただし、依存関係は同じですが、ターゲット「doc」には同じことは当てはまりません。助けてください!

all : setup compile doc

setup : 
        @mkdir -p doc bin

compile: ./src/*.java ./src/cs296BookAnalysis/*.java
        @echo -n Compiling... 
        @javac -d ./bin ./src/cs296BookAnalysis/*.java ./src/BookAnalysisG01.java
        @echo Done!

doc: ./src/*.java ./src/cs296BookAnalysis/*.java
        @echo Generating Documentation using Javadoc... 
        @javadoc -d ./doc ./src/BookAnalysisG01.java -sourcepath ./src cs296BookAnalysis
        @echo Done!

clean: rm -rf doc bin
4

2 に答える 2

1

それがmakefileの仕組みだからです:-)。

makefile はrulesで構成されています。インデントされていない行で始まる各ブロックがルールです。各ルールはmake、特定のファイルの作成方法を示しています。

通常、「:」の左側の部分は、生成されたファイルの名前 (ターゲット) です。たとえば、C プログラムの場合、次のように記述します。

main.o : main.c defs.h
    cc -c main.c

これはmake次のことを示しています。

  • 作り方のルールですmain.o
  • main.oに依存しmain.cdefs.h
  • 実行cc ...して作成するmain.o

結果として、いつでもパーツmakeを実行しますcc...

  • main.o存在しないか、
  • main.cまたはdefs.hより新しいmain.o

さて、あなたの例では、ルールのターゲットは作成されたファイルではありません。このようなターゲットは、偽のターゲットと呼ばれます。これらのターゲットがファイルとして検出されることはないためmake、ルールは毎回実行されます。

docルールは例外です。ディレクトリはdoc実際に存在し、javadocこのディレクトリへの書き込み以降、ディレクトリのタイムスタンプが更新されます。はソース ファイルよりも新しいmakeことがわかり、ルールは実行されません。doc


とはいえ、Java コードのコンパイルに Makefile を使用しないことを強くお勧めします。確かに可能ですが、Makefile は C コード用に設計されており、Java 用の多くの便利な機能が欠けています。代わりに、Java 用のビルド ツールを使用してください。利用可能なものはいくつかあります。Mavenをお勧めします。

于 2013-03-23T21:53:14.670 に答える
0

これを試して見てください.....

.Phony : abc 

doc : ./src/*.java ./src/cs296BookAnalysis/*.java  abc
        @echo Generating Documentation using Javadoc... 
        @javadoc -d ./doc ./src/BookAnalysisG01.java -sourcepath ./src cs296BookAnalysis
        @echo Done!

abc : 

ここで abc は存在する必要のない偽のターゲットであり、前提条件やレシピがないため作成されません。make にターゲット abc のビルドを強制するために使用され、その過程で doc ターゲットも out として表示されます。日付の....それがあなたが望んでいたものであり、「すべてを作る」を呼び出すたびにドキュメントターゲットがビルドされるようにします。

于 2013-03-24T00:48:48.553 に答える