我有以下make文件目标:
all_libs:
$(foreach模块,$(LIBMODULES),cd $(模块)&& $(MAKE)lib;)
尽管使用make -j,但每次执行一个。如果库只包含少量源文件,那么很多,因此许多可用的CPU核心利用不足。如何使这个并行编译所有库?
尝试了下面的建议并且不起作用。 'cd'部分存在问题。在cd命令之前添加@echo $(LIBMODULES)后,我得到以下输出:
15:25:15 **** Build of configuration Rev3 Debug for project p4080ds **** make -m all_libs /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/utils /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/dda /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/mqtpcid_app /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/mqtpcid_core /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/mqtpcid_drv /cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/source/mqtpcid_lib cd . && /cygdrive/d/Cook/OSE5.7_PPC/cygwin/bin/make lib make[1]: Entering directory `/cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/examples/p4080ds' make[1]: Leaving directory `/cygdrive/y/MCT_Comp/comp/tools/cdk/OSE/OSE5.7_PPC/examples/p4080ds' make[1]: *** No rule to make target `lib'. Stop. make: *** [all_libs] Error 2
您可以看到$(@ D)正在转换为'。'而不是$(LIBMODULES)变量的当前元素。
更新:根据make $(@ D)转换为:
‘$(@D)’ The directory part of the file name of the target, with the trailing slash removed. If the value of ‘$@’ is dir/foo.o then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
答案 0 :(得分:1)
你试过这个吗?
$(LIBMODULES):
$(MAKE) -C $@ lib
-C告诉make更改目录。看起来$LIBMODULES
已经是目录列表,因此您无需使用$(@D)
来获取目录名称。
答案 1 :(得分:0)
你想要的东西是:
all_libs: $(LIBMODULES)
$(LIBMODULES):
cd $(@D) && $(MAKE) lib
假设首先,那些目标不与其他东西发生冲突,其次可以做这样的递归构建,这是值得商榷的。递归制作并不是一个好主意(因为所有原因,在google上查找'递归使得被认为有害')。