CMake удалить включить каталог

Есть ли способ удалить один раз найденный каталог включения в CMake. Я нашел похожий вопрос Вот. Но ответ не имеет большого смысла для меня.

Мне нужно почти то же самое, что и автор вышеупомянутого сообщения. У меня есть глобальный файл CMakeLists.txt, который находит все необходимые пути включения. Однако в файле CMakeLists.txt одного конкретного подмодуля я хочу «скрыть» или «удалить» системный путь включения и предоставить альтернативный путь включения.

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

4

Решение

Если вы можете позволить себе использовать более новую версию CMake (2.8.11 или выше), предпочтите target_include_directories над include_directories и большинство ваших проблем должно исчезнуть сразу.

Проблема в том, что старый include_directories работает со свойствами каталога, который работает только в том случае, если физическая структура файлов на жестком диске точно соответствует логической организации кода в различных подпроектах. С более сложными кодовыми базами это часто трудно достичь и приводит к проблемам, подобным той, что вы описали. Новый target_include_directories вместо этого работает с целевыми свойствами, то есть список включаемых каталогов для файла определяется тем, к какому подпроекту он принадлежит. Обычно это более естественный способ думать о таких вариантах сборки.

Если вы застряли с более старой версией CMake или вам придется использовать include_directories по другим причинам (которые могут иметь место здесь, если проблема заключается во внешней библиотеке, которую вы не можете изменить), вы можете попробовать аляповатый с INCLUDE_DIRECTORIES свойство каталога, которое устанавливается include_directories команда, но будьте готовы к некоторой возни:

get_property(the_include_dirs DIRECTORY foo PROPERTY INCLUDE_DIRECTORIES)
string(REPLACE ${what_needs_to_go} "" new_include_dirs ${the_include_dirs})
set_property(DIRECTORY foo PROPERTY INCLUDE_DIRECTORIES ${new_include_dirs})
8

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector