java - Makefile:$(shell find ...) 未输出正确的结果

标签 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" 返回目录中的所有类文件?

最佳答案

如果在 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/

相关文章:

c++ - 为什么 g++ 不使用 -I 选项?

linux - Silabs Usb CP210x 驱动错误

c++ - 如何将在 Linux 中从命令行编译的 C 程序导出到 IDE?

java - Log4j2 - 写入以 XML 声明的特定记录器

java - 提取具有相同类名的表数据

Java:我应该使用什么类型作为可调整大小的基元列表?

java - 在 Android Studio 中更改作者模板

makefile - 修复了 cmake 输出目录

c - 如何识别大型C项目中的“死c文件”?

java - 错误: missing return value in Java