Добавление заголовков способом Modern CMake в большой проект - PullRequest
0 голосов
/ 01 января 2019

Я работаю над проектом, который включает в себя игровой каркас на основе SDL, редактор и игру.Структура каталогов выглядит примерно так (отредактировано для краткости)

├── CMake
├── Libraries
├── Resources
└── Source
    ├── Editor
    ├── Framework
    │   └── Source
    │       ├── AI
    │       │   ├── Private
    │       │   └── Public
    │       ├── Game
    │       │   ├── Private
    │       │   └── Public
    │       ├── Graphics
    │       │   ├── Private
    │       │   └── Public
    │       └── Networking
    ├── Game
    │   └── Source
    │       └── Runtime
    │           └── Launch
    │               ├── Private
    │               └── Public
    └── Server

Моя команда add_executable выполняется в Game / Source / Runtime / Launch / Private и зависит от файлов издругие модули.

Согласно некоторым инструкциям CMake и принятому ответу на следующий вопрос, заголовки для данной цели должны быть включены в вызов add_executable, чтобы они были перечислены как зависимости.в make-файле.

Как правильно добавить включаемые каталоги с помощью CMake

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

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

1 Ответ

0 голосов
/ 01 января 2019

Вы можете точно следовать шаблону в ссылке, которую вы отправили.Для каждой библиотеки (я предполагаю, что они являются библиотеками / целями в CMake), используйте:

target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Private PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Public)

Делая это, вы говорите CMake, что личные папки предназначены только для текущей цели, но если кто-то использует цельдля другой цели следует добавить общедоступные каталоги.

Теперь вам просто нужно сделать:

target_link_libraries(${target} PRIVATE Framework_Source)

Если Framework_Source - это имя цели.${target} - это название цели, которую вы сейчас строите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...