这个问题已经在文件级别得到解答。但是我有一个更大的项目,它有很多项目间的依赖关系(由动态生成的 DBus 标头引起)。
我创建了以下示例(示例文件为 ZIP - 实际项目要复杂得多)。
顶层Makefile
如下:
sub-%:
$(MAKE) -C $(patsubst sub-%,%,$@)
default:
$(MAKE) -j12 sub-p1 sub-p2 sub-p3
子项目的 Makefile 如下所示(p1
,p2
和p3
):
all: p1
../lib/lib.a:
$(MAKE) -C ../lib lib.a
p1: ../lib/lib.a
cp -f ../lib/lib.a p1
并且 Makefilelib
看起来像这样:
lib.a:
sleep 2
date > $@
echo Done with building $@
问题:这个库是为每个项目p*
分别并行构建的——在这个例子中这不是问题,但在我们的例子中它会导致无法解决的问题。
当我调用make
顶层时,我得到以下输出:
$ make
make -j12 sub-p1 sub-p2 sub-p3
make[1]: Entering directory '/home/kkr/tmp/parallelmake'
make -C p1
make -C p2
make -C p3
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p1'
make -C ../lib lib.a
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p2'
make -C ../lib lib.a
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p3'
make -C ../lib lib.a
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib'
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib'
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib'
sleep 2
sleep 2
sleep 2
date > lib.a
date > lib.a
date > lib.a
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib'
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib'
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib'
cp -f ../lib/lib.a p3
cp -f ../lib/lib.a p1
cp -f ../lib/lib.a p2
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p3'
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p1'
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p2'
make[1]: Leaving directory '/home/kkr/tmp/parallelmake'
问题:是否可以以某种方式自动同步子项目?
由于real project
有 13 个子项目 - 其中大多数具有项目间依赖关系 - 手动同步将非常困难。