Concurrency 如何防止make中的种族状况?

Concurrency 如何防止make中的种族状况?,concurrency,makefile,gnu,Concurrency,Makefile,Gnu,正如标题所暗示的,我怎样才能在make中防止种族状况 我的特定用例是我希望清理和然后构建所有目标: make -j 4 clean all 我是否应该放弃并满足于makeclean&&make-j4 all?我认为实现这一目标的唯一方法是将其放入Makefile: all : clean 这是你不想要的(显然)。我的下一个想法是: clean_all: clean $(MAKE) all 这将允许您编写make-j clean_all,但我也不满意它。您不能真正并行执行一个创建目标

正如标题所暗示的,我怎样才能在make中防止种族状况

我的特定用例是我希望
清理
然后
构建
所有
目标:

make -j 4 clean all

我是否应该放弃并满足于
makeclean&&make-j4 all

我认为实现这一目标的唯一方法是将其放入
Makefile

all : clean
这是你不想要的(显然)。我的下一个想法是:

clean_all: clean
    $(MAKE) all

这将允许您编写
make-j clean_all
,但我也不满意它。

您不能真正并行执行一个创建目标和另一个销毁目标的方法

您心目中不满意的用例有哪些:

make clean && make -j4

?

这是重复的吗?我认为从实用的角度来看,这个问题听起来不错,但是
make clean&&make-j4
make-j4 clean all
长整整4个字符。你的问题的答案是,我认为这个解决方案是完全可以接受的,但如果有其他方法可以做到这一点,我想知道。如果我必须将冗长的参数传递给make命令,则可能会出现另一种情况。在这种情况下,将命令大小减半对我很有吸引力。与我刚才所说的内容相关的另一个原因是当我需要从不同的目录构建时。我经常使用
make-C some/path/to/dir
。@vmrob我明白了。另一方面,构建是一个按键过程,这是非常基本的。在DEs中,您可以指定一次构建命令,然后使用一个键多次构建它。在shell中,您可以使用命令历史记录来重复以前的任何命令。尽管如此,如果GNU能够说某个目标不能与其他目标并行构建,那就太好了……不幸的是,我认为这是唯一的方法。但这对我来说是不可接受的。看来我会坚持使用
清除和&makeall
<代码>重建所有:所有|清理
应该做你想做的want@Kurt:听起来像是个答案;请创建一个新的,并解释它是如何工作的。