TL; DR:如何在find
中使用Makefile
来识别相关的源文件(例如,所有.c
个文件)?我知道如何使用wildcard
,但我无法让find
工作。
更长的版本:
我将Makefile
作为共享图书馆练习的一部分组合在一起;我注意到当我使用以下行为我的共享库指定源文件和目标文件(即.c
文件)时,运行make
(gcc fatal error: no input files
)后出现错误:
SRC=$(find src/ -maxdepth 1 -type f -regex ".*\.c")
OBJ=$(patsubst %.c,%.o,$(SRC))
*rest-of-makefile*
但是,当我使用wildcard
代替find
时,它会正确编译:
SRC=$(wildcard src/*.c)
OBJ=$(patsubst %.c,%.o,$(SRC))
*rest-of-makefile*
(作为参考,下面列出的是确认find
命令在从shell运行时确实返回了目标文件。)
使用find
命令(在我的Makefile
中)搜索源文件的正确语法是什么(如果可能的话)?
(为什么我更喜欢使用find ?:我喜欢这样一个事实:我可以通过从shell运行命令来快速仔细检查find
语句的结果;我无法做到这一点wildcard
。另外,如果可能,我还要依赖正则表达式。)
作为参考,下面是相关的树结构。正如您所看到的(从下面的第二个代码块),运行Makefile中指定的find
命令(即从上面)确实返回了预期的文件(src/libex29.c
)。换句话说,由于find
选项或正则表达式中的语法问题,上述问题并非如此。
.
├── build
├── Makefile
├── src
│ ├── dbg.h
│ ├── libex29.c
│ └── minunit.h
└── tests
├── libex29_tests.c
└── runtests.sh
从上面find
文件夹中运行.
的结果:
~/lchw30$ find src/ -maxdepth 1 -type f -regex ".*\.c"
src/libex29.c
P.S。我知道这篇文章在技术上违反了all posted code must compile
的规则 - 我只是认为包含Makefile
和libex29.c
源文件的整个代码都是过度的。如果情况不是这样,请告诉我 - 如果人们愿意,我很乐意完整地发布文件。
答案 0 :(得分:2)
make没有find
功能。您必须使用shell
函数来运行查找。另外,出于性能原因,您应始终使用:=
而不是=
来shell
(以及wildcard
)。为了清楚起见,你应该在make中为作业添加空格:
SRC := $(shell find src/ -maxdepth 1 -type f -regex ".*\.c")
另外,我不知道你为什么要在这里使用find
。如果你想搜索包含多个级别的整个子目录结构,find
是好的,但wildcard
对于简单的目录查找来说效率要高得多。