0

このMakefileを使用してJavaコードをコンパイルしようとしています。ただし、makeを実行すると、コードが複数回コンパイルされます。

Makefile:

.PHONY: all clean run

SOURCES = \
    Models/CustomException \
    Models/Forest \
    Models/ForestContainer \
    Models/Owner \
    Models/OwnerContainer \
    Models/Tree


SRC = $(addprefix src/, $(addsuffix .java, $(SOURCES)))
BIN = $(addprefix bin/, $(addsuffix .class, $(SOURCES)))

all: ${BIN}

clean:
    -rm -f ${BIN};

${BIN}: ${SRC}
    mkdir -p bin/Controllers;
    mkdir -p bin/Models;
    mkdir -p bin/Views;
    javac -d bin ${SRC};

run: all
    java -cp bin Program;

出力:

┌─( klim ) - ( ~/workspace/Forest-mvc )
└─> make

mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;

ご覧のとおり、コマンドは複数回、実際には6回実行されます。SOURCEの数が追加/削除されると、コマンドを実行する回数が増加/減少します。

どうすればいいの?

4

3 に答える 3

1

javac の後にメイン クラスを追加するだけです。

${BIN}: ${SRC}
    javac -d bin -cp . Models/Tree.java

メイン クラスに依存するすべてのクラスとフォルダー (パッケージ) が自動的にコンパイルされます。あなたのメイクは、すでにコンパイルされているいくつかのクラスを何度もコンパイルしています。

于 2012-09-05T17:17:29.193 に答える
0

、の最初のターゲットは、 6つの異なるサブターゲットMakefileall依存します。おそらく、実行の開始時に、これらのいずれも存在しないため、makeこれらの6つのサブターゲットのそれぞれを構築する必要があると考えています。ただし、これらのサブターゲットのいずれかを構築すると、実際には、これを定義した方法で6つすべてが構築されますが、それmakeはわかりません。

肝心なのは、それはあなたが言ったことをしているということです。あなたがそれをするように言ったことが冗長であるという事実は重要ではありませんmake

于 2012-09-05T17:19:37.357 に答える
0

ターゲットごとにint${BIN}makeは${BIN}:$ {SRC}ルールを呼び出しますが、javacのコマンドラインですべてのソースを指定します。javac行で${SRC}を$<に置き換えたいと思うかもしれません。

于 2012-09-05T17:20:08.820 に答える