使用 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 如何构建两个东西:ab/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/foo12/runb/foo12/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)

的先决条件类型