Java Makefile:$(shell find…)不';t输出正确的结果

Java Makefile:$(shell find…)不';t输出正确的结果,java,makefile,Java,Makefile,当运行此makefile时存在类文件时,$(所有类)已正确设置 为什么echo$(所有类)在find时打印一个空白-name“*.class”返回目录中的所有类文件?如果类文件在make开始运行时不存在,all_class将设置为空,因为它们在运行shell find时不存在 但是,最后一行的find将在编译完所有Java文件后运行 一个更简单的示例可能会有所帮助,让我们首先创建一个文件xyzy1: ALL_SRC := $(shell find . -name "*.java") ALL_CL

当运行此makefile时存在类文件时,
$(所有类)
已正确设置


为什么
echo$(所有类)
find时打印一个空白-name“*.class”
返回目录中的所有类文件?

如果类文件在
make
开始运行时不存在,
all_class
将设置为空,因为它们在运行
shell find
时不存在

但是,最后一行的
find
将在编译完所有Java文件后运行

一个更简单的示例可能会有所帮助,让我们首先创建一个文件
xyzy1

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,它与您的makefile在创建和运行时间方面基本相同:

touch xyzzy1
在上面运行
make
时,您会看到:

XYZZY=$(shell ls xyzzy*)
all:
    echo ===
    touch xyzzy2
    echo $(XYZZY)
    echo ===
    ls xyzzy*
    rm xyzzy2
    echo ===
这是因为
xyzy=$(shell ls xyzy*)
的执行发生在
all
规则启动之前(因此
xyzy2
还不存在)


all
规则中的
ls xyzy*
touch
之后和
rm
之前执行,因此此时两个文件都存在。

感谢您的回复。我认为“=”赋值,与“:=”赋值相反,是在使用变量时计算的。有没有办法推迟对所有类变量的求值?@yawnerish,我认为这只是一个误解。延迟意味着在第一次传递需要它之前,或者在第二次传递发生时,不会对它进行评估。这并不意味着推迟到第二遍使用。还有一个问题。。。你个人如何解决这个问题?我该怎么做才能使$(ALL_类)获取最新的文件列表?只是运行
find-名称“*.class”
起作用,但我希望将这样的命令保存在变量的顶部。paxdiablo上面关于延迟的评论有点误导。这不起作用的原因是make在尝试运行配方中的任何命令之前会扩展整个配方中的所有变量。因此,在调用
echo“Compiling…”
语句之前,ALL_类的值都会展开。这就是为什么它是空的;将变量设置为:
ALL_CLASS=`find-名称“*.class”`
。现在,无论何时使用该变量,它都会扩展到反引号字符串,shell将运行该字符串而不是生成该字符串。
===
xyzzy1
===
xyzzy1 xyzzy2
===