Makefile:如何获取通配符 (!arch)/*.c

Makefile: How to get wildcard (!arch)/*.c

我正在尝试制作一个 makefile 来编译我项目中的所有源文件,这些文件分布在几个目录中,如下所示:

libc/
  arch/
  include/
  math/
  stdio/

我想从 arch 和 include 目录中排除所有文件,我可以在 shell 中使用命令 ls !(arch)/*.c 执行此操作 但是当我尝试使用

做同样的事情时

$(wildcard !(arch)/*.c)

没用。 我怎样才能让它在我的生成文件中工作?我可以使用 !(arch || include) 来排除这两个目录吗?

$(wildcard !(arch)/*.c)

it doesn't work. How can i make it work in my makefile? Can i use something like !(arch || include) to exclude both directories?

假设你问的是 GNU Make,那么这两个问题的答案都是否定的。

The syntax GNU Make 中的内置通配符非常基本:

The wildcard characters in make are ‘*’, ‘?’ and ‘[…]’, the same as in the Bourne shell.

您可以使用 built-in functions 完成此类任务:

$(wildcard $(addsuffix *.c,$(filter-out arch/,$(wildcard */))))
$(wildcard $(addsuffix *.c,$(filter-out arch/ include/,$(wildcard */))))

或者 shell 到 find:

$(shell find -name "*.c" -a \! -path "./arch/*" -a \! -path "./include/*")

# This one is a bit more efficient:
$(shell find \( -path "./arch" -prune -o -path "./include" -prune -o -name "*.c" \) -a -type f)