parallel make:两个目标依赖于同一先决条件,会发生什么?

时间:2013-06-06 08:22:16

标签: parallel-processing makefile

我需要为二进制文件和两个静态库构建源代码。 这是一个例子(为了简洁,我用';'代替了食谱):

objects := a.o b.o ...
.PHONY: all build build_lib
all: build build_lib
build: bin/app
build_lib: bin/libapp.a
bin/app: $(objects) ;
bin/libapp.a $(objects) ;
obj/%.o: %.cpp ;

并行构建会出现问题吗?两个make进程是否可以尝试一次重建相同的* .o文件,从而构建一个破坏的构建?

我猜他们可以,所以我用这种方式重写了代码:

objects := a.o b.o ...
.PHONY: all build build_lib
all: $(objects) | bin/app bin/libapp.a
build: bin/app
build_lib: bin/libapp.a
bin/app: $(objects) ;
bin/libapp.a $(objects) ;
obj/%.o: %.cpp ;

但是--debug = b输出仍显示:

Processing target file `all'.
 File `all' does not exist.
  Processing target file `bin/app'.
   File `bin/app' does not exist.
    Processing target file `obj/client.o'.
    Need to rebuild target `obj/client.o'.
...
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
 File `sb_all' does not exist.
   File `bin/app' does not exist.
   File `bin/libapp.a' does not exist.
...
  Need to rebuild target `bin/app'.
g++  -lgd ...
  Need to rebuild target `bin/libapp.a'.
ar ...
File `all' does not exist.
Target file `all' rebuilt successfully.

所以看起来我的$(对象)目标在仅限订单的先决条件之前没有运行,或者我是否错误地读取了输出?我还需要这个改变吗?

1 个答案:

答案 0 :(得分:1)

不,它没有问题。对于并行性和多个目标(在同一个make 实例中的),Make不会有任何问题,具体取决于相同的先决条件。如果你有make的递归实例和多个不同的make实例尝试构建相同的目标,你就会遇到问题。

仅订单对并行性没有任何影响。如果可能的话,Make仍会并行调用。影响规则运行顺序的唯一方式是声明这些目标之间的先决条件关系。在这里,您只是说必须在all目标之前构建更高级别的目标,这样才能减少并行性。

幸运的是,正如我上面所说,你没必要。只要你的makefile正确定义了任何两个目标之间的依赖关系,make就可以处理更大的图片了。