Makefile: 运行 一个特定的并行目标
Makefile: Running a specific target in parallel
我正在学习 Makefile 并尝试实现并行性。我知道“-j”选项。但是,例如具有以下 makefile(在 Windows 上)-
all: a b c d
a:
# some build rule
b:
# some build rule with parallelism
c:
# some build rule
d:
#some build rule
我正在尝试 运行 make all
与目标 "b" 运行 并行。将 -j 选项与 "b" 的构建规则一起传递不起作用。任何指针?
您可以这样在后台获取 b 的食谱 运行:
all: a b c d
@echo running $@
.PHONY: a b c d all
a c d: | b
@echo -n _$@0 && \
sleep 1 && echo -n _$@1 && \
sleep 1 && echo _$@2
b:
@(echo -n _$@0 && \
sleep 2 && echo -n _$@1 && \
sleep 2 && echo -n _$@2\
) &
输出:
_b0_a0_a1_b1_a2
_c0_c1_b2_c2
_d0_d1_d2
running all
对 b
的仅顺序依赖使 b
首先成为 运行,否则直到 a
完成 -j1
之后它才会开始。 .. 这当然意味着如果您构建 a
c
或 d
.
则必须构建 b
或者,(我不推荐这样做)您可以使用一些手动锁定机制,例如 flock 来防止 a、c 和 d 并行 运行ning(注意flock 只保护一个 shell,所以你必须将你的食谱折叠成一个由 flock 保护的单行才能工作。
我正在学习 Makefile 并尝试实现并行性。我知道“-j”选项。但是,例如具有以下 makefile(在 Windows 上)-
all: a b c d
a:
# some build rule
b:
# some build rule with parallelism
c:
# some build rule
d:
#some build rule
我正在尝试 运行 make all
与目标 "b" 运行 并行。将 -j 选项与 "b" 的构建规则一起传递不起作用。任何指针?
您可以这样在后台获取 b 的食谱 运行:
all: a b c d
@echo running $@
.PHONY: a b c d all
a c d: | b
@echo -n _$@0 && \
sleep 1 && echo -n _$@1 && \
sleep 1 && echo _$@2
b:
@(echo -n _$@0 && \
sleep 2 && echo -n _$@1 && \
sleep 2 && echo -n _$@2\
) &
输出:
_b0_a0_a1_b1_a2
_c0_c1_b2_c2
_d0_d1_d2
running all
对 b
的仅顺序依赖使 b
首先成为 运行,否则直到 a
完成 -j1
之后它才会开始。 .. 这当然意味着如果您构建 a
c
或 d
.
b
或者,(我不推荐这样做)您可以使用一些手动锁定机制,例如 flock 来防止 a、c 和 d 并行 运行ning(注意flock 只保护一个 shell,所以你必须将你的食谱折叠成一个由 flock 保护的单行才能工作。