Makefile:使用`wildcard`与`find`来指定源文件

时间:2014-11-01 23:12:29

标签: makefile find wildcard

TL; DR:如何在find中使用Makefile来识别相关的源文件(例如,所有.c个文件)?我知道如何使用wildcard,但我无法让find工作。

更长的版本: 我将Makefile作为共享图书馆练习的一部分组合在一起;我注意到当我使用以下行为我的共享库指定源文件和目标文件(即.c文件)时,运行makegcc 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的规则 - 我只是认为包含Makefilelibex29.c源文件的整个代码都是过度的。如果情况不是这样,请告诉我 - 如果人们愿意,我很乐意完整地发布文件。

1 个答案:

答案 0 :(得分:2)

make没有find功能。您必须使用shell函数来运行查找。另外,出于性能原因,您应始终使用:=而不是=shell(以及wildcard)。为了清楚起见,你应该在make中为作业添加空格:

SRC := $(shell find src/ -maxdepth 1 -type f -regex ".*\.c")

另外,我不知道你为什么要在这里使用find。如果你想搜索包含多个级别的整个子目录结构,find是好的,但wildcard对于简单的目录查找来说效率要高得多。