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