我正在尝试构建一个执行其他任务的通用任务。我需要它做的是循环目录并使用执行其他任务的每个目录名称。
这就是我所拥有的:
# 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) .
答案 0 :(得分:1)
make-recipe的每一行都是在shell的不同调用中执行的。
您的配方因shell语法错误而失败,因为此行:
for BIN in `ls cmd`; do
不是有效的shell命令。第三行也不是:
done
要在一个shell中执行所有三行,您必须加入它们
使用make的行继续符\
:
# 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=$< $*