首页 > 解决方案 > 使用 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 多个模块构建系统的一小部分)

标签: cmake

解决方案


使用 Makefile 生成器时,您应该尝试使用 load 选项-l来限制作业数量,而不是使用作业编号-j(RTFM ;) )

参考:https ://www.gnu.org/software/make/manual/make.html#Parallel


推荐阅读