如何循环目录

时间:2018-02-04 12:08:23

标签: makefile

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

这就是我所拥有的:

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

但是我得到了这个错误,任何人都可以向我解释如何让它工作 bash ➜ make all-build for BIN in `ls cmd`; do /bin/sh: -c: line 1: syntax error: unexpected end of file make: *** [all-build] Error 2

UPDATE 这就是我的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) .

2 个答案:

答案 0 :(得分:1)

make-recipe的每一行都是在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

答案 1 :(得分:0)

使用ls驱动Make中的循环即使在shell脚本中也是antipattern(如果我正确猜测你想要for f in cmd/*),但在Makefile中加倍。正确的设计是让make知道依赖关系是什么,并从那里开始。

all-%: %: $(patsubst cmd/%,%,$(wildcard cmd/*))
        $(MAKE) --no-print-directory -$(MAKEFLAGS) BIN=$< $*