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-%
我想运行正确的任务