编译一个大的工程时,往往都是透过for循环重重迭代编译各个子模块。如果某些子模块编译出错,没有退出就
$(MAKE) -C $$subdir || exit "$$?"; \
done
会导致最后生成的库没有对应的功能或者符号。此时,我们需要再出现出错时,makefile编译主动退出。
先看网上的一个截图,阐述了一个解决方法:
说明:SUB_BOOKS 是需要循环编译的子模块,通过可以这样获得,SUB_BOOKS = $(shell find path/ -type d )
或者直接赋值也行。先循环在子目录先查找是否存在makefile,存在的情况下编译,要点是在编译子模块
时,添加的
|| exit "$$?"
可以识别到当前模块编译是否出错,是则停止编译。
根据以上分析,我们可以采用如下方式测试:
target:
@for dir in $(subdir); do \
echo ------------------------compiling $$dir------------------------; \
$(MAKE) -C $$subdir || exit "$$?"; \
done
在子模块的某个文件弄一段错误代码,测试会发现去掉 exit "$$?"可以跳过错误继续编译,而加上后就会退出。