Makefiles : using `wildcard` vs. `find` 用于指定源文件

标签 makefile find wildcard

TL;DR: 如何使用 findMakefile为了识别相关的源文件(例如,所有 .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 来做到这一点。另外,如果可能的话,我想依赖正则表达式。)

作为引用,下面是相关的树结构。如您所见(从下面的第二个代码块),运行 find Makefile 中指定的命令(即从上面)确实返回了预期的文件( 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

附言我知道这篇文章在技术上违反了 all posted code must compile 的规则。 - 我只是认为包括 Makefile 的整个代码以及 libex29.c源文件将是矫枉过正。如果不是这样,请告诉我 - 如果人们愿意,很高兴完整地发布文件。

最佳答案

Make 没有 find功能。您必须使用 shell运行查找的函数。此外,您应该始终使用 :=不是 =对于 shell (和 wildcard ,就此而言)出于性能原因。为了清楚起见,您应该在 make 中的分配周围放置空格:

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

我也不明白你为什么要使用 find这里。 find如果要搜索包含多个级别的整个子目录结构,但 wildcard对于简单的目录查找来说效率更高。

关于Makefiles : using `wildcard` vs. `find` 用于指定源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694249/

相关文章:

c - Makefile 文件名约定

bash - find -exec 的变量包含带有引号的 codesign 命令

Solr:对带空格的字符串使用通配符

bash - bash 中点的通配符是什么?

regex - 如何在 bash 中使用异常通配符?

c - 如何在makefile中写入安装标签?

makefile - 为 Makefile 通配符扩展依赖项的目录名

c - 浏览文本文件,用变量的定义/内容替换变量的所有实例

node.js - 在 Node.js 中查找 MongoDB 的查询

mongodb - 在子文档中使用 db.collection.find 查询