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)
我正在尝试制作一个 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)