Error: no source files when using command substitution

Error: no source files when using command substitution

我有以下代码:

all: ./source/Listener.java ./source/ServerThread.java ./source/TestClient.java 
    javac -d target $(find ./source/* | grep .java)

当我运行生成时,我得到了这个输出

javac -d target
error: no source files
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 2

当我 运行 bash 中的 javac 命令时,它编译正常。此外,当我 运行 'find' 部分时,我得到了我想要的文件列表。此外,第 1 行中的文件路径都是准确的。

有什么建议吗?

(我不得不使用find功能,因为正在使用的文件很多,而且随着时间的推移越来越多,我把它减少到3个,但bug仍然存在)

如果要在 Makefile 中执行 shell 命令,请使用此语法:$(shell ...)

警告:

  • 默认shell为sh(使用SHELL宏定义更改)
    • 示例:SHELL=/bin/bash
  • 美元 ($) 符号在 Makefile 和 bash 脚本中是特殊的(如果你想在 shell 脚本中使用它,用双美元将它空间化:$$).
    • 示例:$(shell X=a_value; echo $$a_value)
    • 如果要子进程shell : $(shell echo $$$$) ...丑,不行吗?
  • 你真的要打电话给shell吗?它不是便携式的。假设它。

如果您搜索源文件或其他任何内容,请使用 wildcard 内部 make 函数。

示例:

all: x.class y.class z.class

x.class: a.java dir_b/b.java dir_c/c.java
    @echo "$$^=$^="
    @echo "not portable command ..." $(shell find . -name "*.java")

# Better with deps in target definition
SRCS=$(shell find . -name "*.java")
y.class: $(SRCS)
    @echo x_my_command $^

# Really better (portable)
SRCS=$(wildcard */*.java *.java)
z.class: $(SRCS)
    @echo y_my_command $^

输出:

$^=a.java dir_b/b.java dir_c/c.java=
not portable command ... ./dir_b/b.java ./dir_c/c.java ./a.java
x_my_command dir_b/b.java dir_c/c.java a.java
y_my_command dir_b/b.java dir_c/c.java a.java

正如 Renaud Pacalet 所说,我不得不在第二行前面多加一个 $。