Из Настройки CMake "make" использовать опцию "- j " по умолчанию
Я хочу, чтобы мой проект CMake был построен make -j N
, всякий раз, когда я вызываю make
из терминала. Я не хочу, чтобы вручную каждый раз.
для этого, я поставил CMAKE_MAKE_PROGRAM переменной командной строки. Я использую ProcessorCount()
функция, которая дает количество процессоров для выполнения сборки параллельно.
когда я делаю make
, Я не вижу никакого ускорения. Однако, если я это сделаю make -j N
, тогда он построен определенно быстрее.
не могли бы вы помочь мне в этом вопросе? (Я разрабатываю это на Linux.)
вот фрагмент кода, который я использую в CMakeList.txt
:
include(ProcessorCount)
ProcessorCount(N)
message("number of processors: " ${N})
if(NOT N EQUAL 0)
set(CTEST_BUILD_FLAGS -j${N})
set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j ${N}")
endif()
message("cmake make program" ${CMAKE_MAKE_PROGRAM})
спасибо.
4 ответов
через параметр CMAKE_MAKE_PROGRAM переменной вы хотите повлиять на процесс сборки. Но:
-
эта переменная влияет только на build via
cmake --build
, а не родной инструмент (make
) вызова:на
CMAKE_MAKE_PROGRAM
переменная устанавливается для использования кодом проекта. Значение также используется cmake (1)--build
и ctest(1)--build-and-test
инструменты для запуска собственной сборки процесс. -
эта переменная должна быть кэш один. Он используется таким образом сделать-как генераторы:
эти генераторы хранят CMAKE_MAKE_PROGRAM в кэше CMake, так что он может быть отредактирован пользователем.
то есть, вам нужно установить эту переменную с
set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
-
эта переменная должна ссылаться на исполняемый файл , не программе с аргументами:
значение может быть полный путь к исполняемому файлу или только имя инструмента, если ожидается, что он будет в пути.
то есть значение "make-j 2" нельзя использовать для этой переменной (разбиение аргументов как list
set(CMAKE_MAKE_PROGRAM make -j 2 CACHE PATH "Path to build tool" FORCE)
тоже не помогло бы).
в общем, вы можете переопределить поведение cmake --build
вызов с параметром CMAKE_MAKE_PROGRAM переменной скрипт, которая называет make
С параллельных вариантов. Но ты! .. --41-->может не влиять на поведение для direct make
вызов.
Если вы хотите ускорить сборку, вы можете запускать несколько процессов make параллельно, но не cmake. Чтобы выполнить каждую сборку с предопределенным количеством параллельных процессов, вы можете определить это в MAKEFLAGS.
установите MAKEFLAGS в скрипте среды, например~/.bashrc, как вы хотите:
export MAKEFLAGS=-j8
в Linux следующие наборы MAKEFLAGS к числу CPU-1: (Держите один CPU свободным для других задач во время сборки) и полезен в средах с динамическим ресурсы, например VMware:
export MAKEFLAGS=-j$(($(grep -c ^processor /proc/cpuinfo) - 0))
может ли этот метод использоваться для вызова нескольких функций? как function1, 2,3 параллельно, а последовательные, любые другие идеи оценили.
пример:
if(FLAG1)
#some variables/options settings
function1(${OPTIONS})
function2(${OPTIONS})
function3(${OPTIONS})
....
endif()
function(fucntion1)
#some variables/options parsing and passed to command.
execute_process(COMMAND COMMAND1
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE res
TIMEOUT 60)
endfunction()
function(fucntion2)
#some variables/options parsing and passed to command.
execute_process(COMMAND COMMAND2
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
RESULT_VARIABLE res
TIMEOUT 60)
endfunction()