Makefile:$(shell find ...)没有输出正确的结果

时间:2013-09-05 02:15:07

标签: java makefile

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"返回目录中的所有类文件时打印空白?

1 个答案:

答案 0 :(得分:0)

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

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

一个更简单的例子可能有所帮助,我们首先创建一个文件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尚不存在)。

ls xyzzy*规则本身中的all在<{em> {/ 1>}和之前 touch之后执行这两个文件都存在。