1
ALL_SRC := $(shell find . -name "*.java")
ALL_CLASS = $(shell find . -name "*.class")

all:
    @echo "Compiling..."
    $(JAVAC) $(ALL_SRC)
    echo $(ALL_CLASS)
    find . -name "*.class"

このmakefileの実行時にクラスファイルが存在する場合、$(ALL_CLASS)正しく設定されます。

ディレクトリ内のすべてのクラスファイルを返すecho $(ALL_CLASS)ときに空白を出力するのはなぜですか?find . -name "*.class"

4

1 に答える 1

0

makeの実行開始時にクラス ファイルが存在しない場合は、実行時にクラス ファイルが存在しないALL_CLASSため、空白に設定されますshell find

ただし、find最後の行は、すべての Java ファイルをコンパイルした後に実行されます。

より簡単な例が役立つ場合があります。最初にファイルを作成しましょうxyzzy1:

touch xyzzy1

次に、次の makefile を使用します。これは、基本的に作成時と実行時のものと同じです。

XYZZY=$(shell ls xyzzy*)
all:
    echo ===
    touch xyzzy2
    echo $(XYZZY)
    echo ===
    ls xyzzy*
    rm xyzzy2
    echo ===

その上で実行makeすると、次のように表示されます。

===
xyzzy1
===
xyzzy1 xyzzy2
===

これは、ルールが開始される前にの実行がXYZZY=$(shell ls xyzzy*)発生するためです (まだ存在していません)。allxyzzy2

ルールls xyzzy*内の は の前後に実行れるため、その時点で両方のファイルが存在します。alltouchrm

于 2013-09-05T02:21:48.157 に答える