Приостановить master CMake при использовании ExternalProject

#cmake

#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
)
  

Это отлично работает при сборке на ПК, но при сборке на целевой среде с ограниченными ресурсами 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 )

Ответ №1:

При использовании генератора Makefile вы должны попытаться использовать параметр load -l для ограничения количества заданий вместо использования номера заданий -j (RTFM ;))

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

Комментарии:

1. Это выглядит полезным; Я могу использовать ProcessorCount() , чтобы получить количество ядер, а затем передать это -l .