使用 makefile 构建嵌套目录
Building nested directories using makefile
我尝试构建以下嵌套目录:Iterating through a list of directories in a Makefile
这是我的脚本
LAYER1 = a b
LAYER2 = 1 2
$(LAYER1)/foo%/run: $(DIR)
mkdir -p $@
DIR: $(addsuffix /foo$(LAYER2)/run, $(LAYER1))
预期的输出是创建 a/foo1/run a/foo2/run b/foo1/run b/foo2/run 但输出只有 1 个名为 a 的目录。如何创建预期的目录结构?
规则是什么:
$(LAYER1)/foo%/run: $(DIR)
扩展到?它扩展为:
a b/foo%/run: $(DIR)
(我不知道 $(DIR)
应该是什么)这是一个明确的规则,告诉 make 如何构建两个东西:a
和 b/foo%/run
(这是不是模式规则,因为并非所有目标都包含 %
).
因为 a
这里是 makefile 中的第一个目标,当你 运行 make
.
$(addsuffix /foo$(LAYER2)/run, $(LAYER1))
是做什么的?它获取 $(LAYER1)
中的每个单词并在其前面加上字符串 /foo$(LAYER2)/run
。那个字符串是什么?是 /foo1 2/run
。所以结果是:
a/foo1 2/run b/foo1 2/run
这意味着 DIR
具有文件 a/foo1
、2/run
、b/foo1
和 2/run
作为依赖项。
如果 LAYER1
有多个单词,您需要遍历它,而不是按原样使用它。
请参阅 MadScientist 的回答,了解您的回答为何无效。至于可行的东西,您可能需要如下所示的代码:
LAYER1 = a b
LAYER2 = 1 2
DIRS := $(foreach L1,$(LAYER1),\
$(foreach L2,$(LAYER2),\
$(L1)/foo$(L2)/run))
all: | $(DIRS)
$(DIRS):
mkdir -p $@
注意使用 order-only dependencies 作为 $(DIRS)
的先决条件类型
我尝试构建以下嵌套目录:Iterating through a list of directories in a Makefile
这是我的脚本
LAYER1 = a b
LAYER2 = 1 2
$(LAYER1)/foo%/run: $(DIR)
mkdir -p $@
DIR: $(addsuffix /foo$(LAYER2)/run, $(LAYER1))
预期的输出是创建 a/foo1/run a/foo2/run b/foo1/run b/foo2/run 但输出只有 1 个名为 a 的目录。如何创建预期的目录结构?
规则是什么:
$(LAYER1)/foo%/run: $(DIR)
扩展到?它扩展为:
a b/foo%/run: $(DIR)
(我不知道 $(DIR)
应该是什么)这是一个明确的规则,告诉 make 如何构建两个东西:a
和 b/foo%/run
(这是不是模式规则,因为并非所有目标都包含 %
).
因为 a
这里是 makefile 中的第一个目标,当你 运行 make
.
$(addsuffix /foo$(LAYER2)/run, $(LAYER1))
是做什么的?它获取 $(LAYER1)
中的每个单词并在其前面加上字符串 /foo$(LAYER2)/run
。那个字符串是什么?是 /foo1 2/run
。所以结果是:
a/foo1 2/run b/foo1 2/run
这意味着 DIR
具有文件 a/foo1
、2/run
、b/foo1
和 2/run
作为依赖项。
如果 LAYER1
有多个单词,您需要遍历它,而不是按原样使用它。
请参阅 MadScientist 的回答,了解您的回答为何无效。至于可行的东西,您可能需要如下所示的代码:
LAYER1 = a b
LAYER2 = 1 2
DIRS := $(foreach L1,$(LAYER1),\
$(foreach L2,$(LAYER2),\
$(L1)/foo$(L2)/run))
all: | $(DIRS)
$(DIRS):
mkdir -p $@
注意使用 order-only dependencies 作为 $(DIRS)