Есть ли способ удалить один раз найденный каталог включения в CMake. Я нашел похожий вопрос Вот. Но ответ не имеет большого смысла для меня.
Мне нужно почти то же самое, что и автор вышеупомянутого сообщения. У меня есть глобальный файл CMakeLists.txt, который находит все необходимые пути включения. Однако в файле CMakeLists.txt одного конкретного подмодуля я хочу «скрыть» или «удалить» системный путь включения и предоставить альтернативный путь включения.
Да, одним из решений может быть простое изменение включений в упомянутом подмодуле, но этот подмодуль является внешней библиотекой из другого репозитория, поэтому я не хочу менять его код.
Если вы можете позволить себе использовать более новую версию 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})