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 所说,我不得不在第二行前面多加一个 $。
我有以下代码:
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 所说,我不得不在第二行前面多加一个 $。