Из Настройки 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 переменной вы хотите повлиять на процесс сборки. Но:

  1. эта переменная влияет только на build via cmake --build, а не родной инструмент (make) вызова:

    на CMAKE_MAKE_PROGRAM переменная устанавливается для использования кодом проекта. Значение также используется cmake (1) --build и ctest(1) --build-and-test инструменты для запуска собственной сборки процесс.

  2. эта переменная должна быть кэш один. Он используется таким образом сделать-как генераторы:

    эти генераторы хранят CMAKE_MAKE_PROGRAM в кэше CMake, так что он может быть отредактирован пользователем.

    то есть, вам нужно установить эту переменную с

    set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
    
  3. эта переменная должна ссылаться на исполняемый файл , не программе с аргументами:

    значение может быть полный путь к исполняемому файлу или только имя инструмента, если ожидается, что он будет в пути.

    то есть значение "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))

вы можете установить переменную env MAKEFLAGS с помощью этой команды

export MAKEFLAGS=-j$(nproc)

может ли этот метод использоваться для вызова нескольких функций? как 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()