我们说我的目录结构如下:
root->utils
root->lib
root->bar->lib1
root->bar->lib2
root->foo->lib3
utils
完全独立,但lib1
和lib2
取决于utils
。此外,lib3
取决于lib1
。
递归make看起来像这样:
all:
$(MAKE) -C utils
$(MAKE) -C bar/lib1
$(MAKE) -C bar/lib2
$(MAKE) -C foo/lib3
但是,我有两个要求。首先,我需要支持并行构建。其次,我希望能够独立构建子目录。除非我创建某种JOBS=1
变量,然后使用-j$(JOBS)
调用每个品牌,否则第一个要求对于Makefile来说似乎是不可能的,但是这仍然不是真正的并行,因为它不会做在lib1
之后的同一时间lib2
和utils
。第二个要求意味着lib1
和lib2
的Makefile也必须调用$(MAKE) -C $(TOP)/utils
。我已经阅读了大部分关于制作一个全局Makefile的文章,但我不喜欢缺乏模块化。
有没有解决这些低效率和冗余问题的方法?有没有一种标准的方法来处理它们?
CMake是否解决了这些问题,或者只是将其全部从视图中解决?换句话说,调用由cmake生成的并行make可能会并行构建lib1
和lib2
,还是会经历相同的冗余?
最后,如果我同时从$(MAKE) -C utils
和lib1
调用lib2
会怎样?这些请求是否会被适当地锁定,或者它们是否会发生冲突并造成混乱?