cmake - 使用 ExternalProject 时暂停主 CMake
问题描述
我在如下使用ExternalProject :CMakeLists.txt
include(ExternalProject)
ExternalProject_Add(eigen_build
SOURCE_DIR ${PROJECT_SOURCE_DIR}/${EIGEN_DIR}
# CONFIGURE_COMMAND cmake
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX}
-DCMAKE_BUILD_TYPE:STRING=Release
)
这在 PC 上构建时效果很好,但在使用 构建资源有限的目标时cmake -j8
,有两个活动make
实例,每个实例有 8 个任务,这会导致构建经常因内存不足而失败。
我尝试过的一种解决方法是:
# Find out host architecture
execute_process(COMMAND
dpkg-architecture
-qDEB_HOST_ARCH
OUTPUT_VARIABLE
CMAKE_DEB_HOST_ARCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# If we are building on arm64 then limit subprocesses to 2
if(${CMAKE_DEB_HOST_ARCH} MATCHES "arm64")
set(NUM_SUB_PROCESSES 2)
else()
set(NUM_SUB_PROCESSES 8)
endif()
message("Building library with ${NUM_SUB_PROCESSES} subprocess(es)")
include(ExternalProject)
ExternalProject_Add(eigen_build
SOURCE_DIR ${PROJECT_SOURCE_DIR}/${EIGEN_DIR}
# CONFIGURE_COMMAND cmake
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX}
-DCMAKE_BUILD_TYPE:STRING=Release
BUILD_COMMAND make -j${NUM_SUB_PROCESSES}
INSTALL_COMMAND make install -j${NUM_SUB_PROCESSES}
)
这似乎可行,但仍然可能存在偶尔失败的风险,而且它使子构建非常缓慢,导致其他任务等待完成;单独构建目标当然是手动解决方法。但是,理想情况下,我希望有一些选项可以在ExternalProject
构建时暂停所有父任务;有没有办法做到这一点?(注意,我不能轻易摆弄依赖关系,因为这只是 100 多个模块构建系统的一小部分)
解决方案
使用 Makefile 生成器时,您应该尝试使用 load 选项-l
来限制作业数量,而不是使用作业编号-j
(RTFM ;) )
参考:https ://www.gnu.org/software/make/manual/make.html#Parallel
推荐阅读
- python - Python 3:导入具有相同名称的不同 python 模块
- javascript - 我正在使用 vueJS 2.6.10,我的组件发出一个未定义的值
- python - 将纪元转换为没有 for 循环的工作日
- python - 查找其他 2 小时之间的每个小时
- react-router - 如何使用新的反应路由器钩子测试组件?
- xaml - 具有负边距的元素上的 TapGestureRecognizer 不起作用
- spring-boot - 带有 Content-Type 的 Zuul 网关错误:multipart/form-data API
- java - 检查列表是否排序不区分大小写
- javascript - 使用 v-if 显示第一个渲染,然后使用 v-show?
- python - 我需要有关如何在 Atom 中安装 python 包的指导