CMake: Как построить внешний проект, используя все ядра в системах * nix? - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над проектом на основе CMake, который зависит от гигантской сторонней кодовой базы, которая также использует CMake. Я включаю сторонний проект через механизм ExternalProject_Add. В этом проекте по умолчанию используется Makefiles, хотя его родительским проектом является проект Xcode.

Результирующая сборка внешнего проекта мучительно медленная , потому что он использует только одно ядро. Я не думаю, что смогу заставить проект генерировать проекты Xcode вместо Makefiles.

Предполагая, что я застрял в Makefiles, как я могу сообщить ExternalProject_Add об использовании всех ядер, доступных для титанического стороннего проекта?

Обратите внимание, что добавление неизбежной опции '-j N' (почему 'make' не делает этого по умолчанию?) Должно присутствовать условно для сборок Mac и Linux, но не для Windows / Visual Studio.

1 Ответ

0 голосов
/ 17 марта 2019

Вы в основном уже ответили на вопрос сами: используйте другой генератор сборки. Ninja делает параллельные сборки по умолчанию, а CMake использует его просто отлично.

include(ExternalProject)
ExternalProject_Add(foobar
    [...]
    ## configure options
    # cmake is used by default
    #CONFIGURE_COMMAND cmake
    # cmake will use the same generator as the main project, unless we override it
    CMAKE_GENERATOR Ninja
    ## build options
    BUILD_COMMAND ninja
    [...]
)

Если вы не хотите использовать другой генератор, используйте опции make.Установите MAKEFLAGS в вашей оболочке.В вашем CMakeLists.txt сделайте что-то вроде:

include(ProcessorCount)
ProcessorCount(N)

if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
    include(ExternalProject)
    ExternalProject_Add(foobar
        BUILD_COMMAND make -j${N}
    )
else()
    ## do windows stuff
endif()

Также запомните многие опции ExternalProject_Add() (включая опции *_COMMAND) override разумные значения по умолчанию.Поэтому при определении внешнего проекта начните с малого и добавьте параметры по мере необходимости.

tl; dr

  • Будьте скудны при определении внешнего проекта.Сборка по мере необходимости.
  • Используйте другой генератор сборки, который понимает параллелизм лучше, чем 'make'
  • Если вы хотите использовать другой генератор сборки CMake для вашего внешнего проекта, чем для вашего основного проекта, вы необходимо указать это.
...