使用make将'foreach'转换为并行构建

时间:2014-01-09 13:49:53

标签: makefile

我有以下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.

2 个答案:

答案 0 :(得分:1)

你试过这个吗?

$(LIBMODULES):
    $(MAKE) -C $@ lib

-C告诉make更改目录。看起来$LIBMODULES已经是目录列表,因此您无需使用$(@D)来获取目录名称。

答案 1 :(得分:0)

你想要的东西是:

all_libs: $(LIBMODULES)

$(LIBMODULES):
    cd $(@D) && $(MAKE) lib

假设首先,那些目标不与其他东西发生冲突,其次可以做这样的递归构建,这是值得商榷的。递归制作并不是一个好主意(因为所有原因,在google上查找'递归使得被认为有害')。