【发布时间】:2017-08-02 11:05:09
【问题描述】:
我正在尝试创建依赖于具有目标名称的目录中的文件列表的目标:
bin/%.out: src/%/ $(shell find src/%/* -type f -iname '*.cpp' -o -iname '*.hpp')
# Build stuff here
但是shell find src/%/* ...最终扩展为shell find src//* ...。起初我以为是因为我只能有 1 个目标通配符,但即使在删除 src/%/dependency 之后,它也会遇到同样的问题。
更多上下文:我的目录包含一个“src”目录,其中包含目录。我将“src”的每个子目录都视为“项目”。当我构建时,所有目标文件都应该放在out/src/projname 中。我正在尝试使用find 以递归方式获取每个项目的所有源文件和头文件。所有二进制文件都将进入bin/projname.out,因此,主要依赖项是bin 中的.out 文件,它们的名称与其项目名称相同。 (如果src/abc 存在,bin/abc.out 是all 的依赖项)。
所以对于src中的每个子目录,所有源文件都被编译,目标文件被移动到out/projname,最终将链接到bin/projname.out。
- 源
- 项目0
- cpp/hpp 文件
- 项目1
- cpp/hpp 文件
- 项目0
- 出
- 源
- 项目0
- 目标文件
- 项目1
- 目标文件
- 项目0
- 源
- 斌
- proj0.out
- proj1.out
目前获取项目列表和输出文件列表如下:
SRCS := $(shell find src/* -maxdepth 0 -type d)
SRCS_OUT := $(patsubst src/%,bin/%.out,$(SRCS))
...
all: out/ bin/ $(SRCS_OUT)
项目可以包含子目录等,这就是为什么我在最顶部的代码中使用find。
【问题讨论】:
-
我可以使用宏并将 % 传递给它,然后从宏中返回整个部分吗?
-
这行不通。您可能会使用一些技巧来用您想要的所有源文件填充变量,但我认为如果您可以提供一些上下文,会有一个更好/更清洁的解决方案。
-
好的,我已经更新了问题,希望能提供一些更有用的信息。