2010-07-30 3 views
40

Есть ли способ в CMake принудительно установить путь, указанный через include_directories (или, возможно, через другую функцию), чтобы использовать флаг -системы вместо -I-флага при построении с помощью gcc?Использование -система вместо -I с CMake

Для получения дополнительной информации о -I и -системе см. http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options.

ответ

49

Да вы заставляете путь, чтобы быть системой, включают с помощью дополнительного флага SYSTEM

include_directories(SYSTEM path) 

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

Начиная с CMake 2.8.12 вы можете использовать новое target_include_directories включить системный каталог включает в целевого уровня при одновременном использовании новых характеристик использования cmake:

target_include_directories(foo SYSTEM PUBLIC path) 

Теперь цель foo будет использовать pat h в качестве системы, и все, что ссылается на , foo также будет использовать путь как автоматически, как включить систему. Вы можете управлять распространением этих требований использования, изменив ключевое слово PUBLIC на PRIVATE или INTERFACE.

http://cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

+1

Команда должна быть 'include_directories' без предварительного набора. – Fraser

+0

Спасибо, что заметили ошибку. – RobertJMaynard

+5

Для меня это не работало в MAC OS 10.8, cmake 2.8.1: пока я не использовал 'CMAKE_INCLUDE_SYSTEM_FLAG_CXX =" isystem "' непосредственно перед директивой 'INCLUDE_DIRECTORIES'. – math

-4

Чтобы добавить дополнительные флаги, вы можете использовать CMAKE_C_FLAGS и CMAKE_CXX_FLAGS.

+3

В то время как вы можете добавить включает в себя с CMAKE_C/CXX_FLAGS Это не будет действительно полезным, CMake имеет методы для добавления включает в себя и, как правило, вы хотите использовать их. – ideasman42

10

Как отмечалось уже, правильный способ включить системные пути является:

include_directories(SYSTEM path1 path2)<br> 

Однако по состоянию на CMake 2.8.4 и Makefiles, Это используется только для C++, а не C, I заглянул в него, и GNU.cmake не инициализируется: CMAKE_INCLUDE_SYSTEM_FLAG_C

Таким образом, вы можете установить это самостоятельно сразу после звонка project().

 
if(CMAKE_COMPILER_IS_GNUCC) 
    set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ") 
endif() 

Update:

Разработчики CMake зафиксировали это в 2.8.5

+0

. его фиксируется в более новом cmake. – ideasman42

+1

Да, это было зафиксировано в 2.8.5. Это фиксация с исправлением: http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=33f5a83a5d7aa4c5a021c33a3fa55069da5eeed8 – sleske

Смежные вопросы