Компиляция подпроекта Cmake без компиляции других подпроектов

У меня есть большой проект, который я разделил на «модули» или «подпроекты». Структура каталогов выглядит так (упрощенно, но основная идея):

project-root/

    CMakeLists.txt <-- Contains some variable definitions

    module1/
        CMakeLists.txt <-- Receives variable definitions from top-level
        src/

    module2/
        CMakeLists.txt <-- Receives variable definitions from top-level
        src/

В корневом файле CMakeLists.txt не определены библиотеки или исполняемые файлы. Он использует add_subdirectory(module1) и add_subdirectory(module2) для обозначения модулей более низкого уровня, у которых есть библиотеки и исполняемые файлы.

Теперь все это работает нормально. Я использую CLion, и он может собрать весь проект. Моя проблема заключается в том, что разработчик хочет скомпилировать только один из модулей, не имея дело с другими модулями.

Я создал переменные в CMakeLists.txt корневого уровня, которые используются в файлах CMakeLists.txt модулей. Но если я попытаюсь скомпилировать только один из модулей, конечно, переменная не определена (или пуста). Есть ли стандартный способ решения подобных проблем? Я хочу иметь возможность компилировать каждый модуль независимо, но я не хочу переопределять переменные в каждом файле CMakeLists.txt.


person Eli    schedule 08.02.2018    source источник
comment
1) как насчет использования внутренних переменных set cache, если они не определены в модуле, иначе получите родительское значение (т.е. ничего не делать). 2) Вам также следует взглянуть на материал проекта суперсборки и использование externalProject для добавления подпроектов cf crascit.com/2015/07/25/cmake-gtest 3) если модули независимы, пусть выпускают их в своем собственном репозитории...   -  person Mizux    schedule 08.02.2018


Ответы (1)


Я считаю, что это именно то, что люди делают, когда добавляют опцию «BUILD_TESTS».

Посмотрите, например, на grpc.

Если вы выберете параметр здесь, вы увидите, что если опция определена, то они добавляют библиотеку (они также делают целую кучу других вещей).

Итак, подведем итог:

  1. Создайте вариант: option(BUILD_MODULE_1 "Build module 1" ON)
  2. Звонить add_subdirectory(module1) только if(BUILD_MODULE_1)

В CLion вы можете либо отредактировать кеш и перезагрузить CMake, либо добавить параметр (например, -DBUILD_MODULE_1=OFF) в «параметры CMake» в настройках.

person JonasVautherin    schedule 08.02.2018