Makefile 如何对目录进行循环

Makefile 如何对目录进行循环,makefile,Makefile,我正在尝试构建一个将执行其他任务的通用任务。我需要它做的是对目录进行循环,并使用每个目录名为它执行其他任务 这就是我所拥有的: # GENERIC TASKS all-%: for BIN in `ls cmd`; do @$(MAKE) --no-print-directory BIN=$(BIN) $* done 但是我犯了这个错误,有人能解释一下我该怎么做吗 bash ➜ 全力以赴 对于'ls cmd'中的BIN;做 /bin/sh:-c:第1行:语法错误

我正在尝试构建一个将执行其他任务的通用任务。我需要它做的是对目录进行循环,并使用每个目录名为它执行其他任务

这就是我所拥有的:

# GENERIC TASKS
all-%:
    for BIN in `ls cmd`; do
        @$(MAKE) --no-print-directory BIN=$(BIN) $*
    done
但是我犯了这个错误,有人能解释一下我该怎么做吗
bash
➜ 全力以赴
对于'ls cmd'中的BIN;做
/bin/sh:-c:第1行:语法错误:文件意外结束
生成:**[所有生成]错误2

更新 以下是我的makefile的完整流程:

all-%:
    for BIN in `ls cmd`; do \
        @$(MAKE) --no-print-directory BIN=$BIN $*; \
    done
build-%:
    @$(MAKE) --no-print-directory BIN=$* build
build:
    docker build --no-cache --build-arg BIN=$(BIN) -t $(BIN) .

make配方的每一行都在shell的不同调用中执行

您的配方失败,出现shell语法错误,原因是此行:

for BIN in `ls cmd`; do
不是有效的shell命令。第三行也不是:

done
要在一个shell中执行所有三行,必须将它们连接起来 使用make的行连续字符
\
将其转换为单个shell命令:

# GENERIC TASKS
all-%:
    for BIN in `ls cmd`; do \
        @$(MAKE) --no-print-directory BIN=$$BIN $*; \
    done

另请注意
BIN=$$BIN
,而不是
$(BIN)
BIN
在这里是一个shell变量,而不是make变量:
$$
转义
$
-按make展开,以保留shell展开
$BIN

在Make中使用
ls
驱动循环是一个偶数shell脚本(如果我猜对了的话,您希望在cmd/*中为f使用
),但在Makefile中更是如此。正确的设计应该是让
知道依赖关系是什么,并从中吸取教训

all-%: %: $(patsubst cmd/%,%,$(wildcard cmd/*))
        $(MAKE) --no-print-directory -$(MAKEFLAGS) BIN=$< $*
all-%:%:$(patsubst cmd/%,%,$(通配符cmd/*))
$(MAKE)--无打印目录-$(MAKEFLAGS)BIN=$<$*

这是正确的,但还不够。您还需要在循环中使用shell变量
$BIN
,而不是make变量
$(BIN)
,该变量从未设置为任何值。要做到这一点,您需要转义
$
,因此:
。。。BIN=$$BIN$*@madscitist,已修复。
Makefile:5:**混合了隐式和静态模式规则。停止。
也许我猜错了你的目录结构。
all-%
中的
%
是否引用目录?可能尝试将
$(patsubst cmd/%,all-%,$(wildcard cmd/*):
作为整个依赖项行。否%表示通用任务名称中的另一个makefile任务。因此,任务与
cmd
之间的关系是什么,我假设它是一个目录?是的,cmd是一个包含其他目录的目录,基于cmd,我想设置BIN变量,基于
all-%
我想运行正确的任务