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"
返回目录中的所有类文件?
最佳答案
如果在 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*)
的执行发生在 all
规则开始之前(所以 >xyzzy2
尚不存在)。
all
规则本身中的 ls xyzzy*
在touch
之后和之前执行 rm
,因此两个文件此时都存在。
关于java - Makefile:$(shell find ...) 未输出正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18626692/