1

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

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.

因此,似乎我的 $(objects) 目标在仅订购先决条件之前没有运行,还是我错误地读取了输出?我需要这个改变吗?

4

1 回答 1

2

不,没有问题。根据相同的先决条件,Make 不会对并行性和多个目标(在同一实例中)产生任何问题 make 。如果您有 make 的递归实例和多个不同的 make 实例尝试构建相同的目标,您将遇到问题。

Order-only 对并行性根本没有任何影响。如果可能,Make 仍将并行调用事物。影响规则运行顺序的唯一方法是声明这些目标之间的先决条件关系。在这里,您只是说两个更高级别的目标都必须在all目标之前构建,因此这对降低并行度没有任何作用。

幸运的是,正如我上面所说,您不必这样做。只要您的 makefile 正确定义了任何两个目标之间的依赖关系,make 就可以很好地处理大局。

于 2013-06-06T12:51:51.817 回答