Java Makefile:$(shell find…)不';t输出正确的结果
当运行此makefile时存在类文件时,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
$(所有类)
已正确设置
为什么
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
===