2012-04-06 2 views
95

У нас есть комплект cross platform CMake build scripts, и мы поддерживаем здание с MSVC и GCC.В cmake, как я могу проверить, является ли компилятор Clang?

Мы пробуем Clang, но я не могу понять, как проверить, является ли компилятор Clang скриптом CMake.

Что я должен проверить, чтобы увидеть, является ли компилятор Clang или нет? В настоящее время мы используем MSVC и CMAKE_COMPILER_IS_GNU<LANG> для тестирования MSVC и GCC соответственно.

+0

Вы можете установить компилятор, установив CMAKE_C_COMPILER и CMAKE_CXX_COMPILER в путь к clang или clang ++. +1 для clang. – Zaffy

+0

Зачем вам это нужно? Clang очень похож на GCC, с точки зрения принятых параметров компилятора ... –

+0

@BasileStarynkevitch Поскольку мы поддерживали MSVC, нам нужно было обнаружить Clang, чтобы мы знали, включать ли GCC-подобные параметры или параметры, подобные MSVC. Мне было слишком долго вспоминать, но, конечно же, мы могли использовать варианты, не поддерживаемые Кланом. – leedm777

ответ

158

Надежная проверка заключается в использовании CMAKE_<LANG>_COMPILER_ID переменных. Например, для проверки ++ компилятор C:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    # using Clang 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    # using GCC 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") 
    # using Intel C++ 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 
    # using Visual Studio C++ 
endif() 

Они также работают правильно, если компилятор обёртку ccache используется.

Начиная с CMake 3.0.0 значение CMAKE_<LANG>_COMPILER_ID для предоставленного Apple Clang теперь AppleClang. Для того, чтобы проверить как Apple, при условии Clang и регулярном Clang используют следующее, если условие:

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 
    # using regular Clang or AppleClang 
endif() 

см также AppleClang policy description.

+0

В документации [cmake] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_LANG_COMPILER_ID) говорится: «Это используется при определении компилятора и может быть изменено» , В противном случае это было бы прекрасно :-( – leedm777

+0

Возможно, это также не рекомендуется использовать решение 'CMAKE_CXX_COMPILER_ARG1'. Это, похоже, не документировано вообще. – sakra

+15

Как и у CMake 2.8.10, эта переменная (наконец!) Документирована. См .: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID –

0

людоед 3D источник код двигателя использует следующие check:

if (CMAKE_CXX_COMPILER MATCHES ".*clang") 
    set(CMAKE_COMPILER_IS_CLANGXX 1) 
endif() 
+3

Это близко, но не работает, когда вы используете [ccache] (http: // ccache .samba.org /) (т. е. 'export CXX =" ccache clang ++ "') – leedm777

+4

Достаточно близко, я дам его вам. Я использовал 'if (" $ {CMAKE_CXX_COMPILER} $ {CMAKE_CXX_COMPILER_ARG1} "MATCHES". * Clang ")' для обработки случая ccache. – leedm777

+0

Это не работает для меня как '$ {CMAKE_CXX_COMPILER} ==/Библиотека/Разработчик/CommandLineTools/usr/bin/C++'. Принятый ответ работает. –

0

Просто, чтобы избежать каких-либо проблем mispelling, я использую это:

if (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]") #Case insensitive match 
    set(IS_CLANG_BUILD true) 
else() 
    set(IS_CLANG_BUILD false) 
endif() 

Для изготовления случае регулярное выражение нечувствительным, я попробовал все here без успеха (кажется, не будет поддерживаться в CMake).

+0

Действительно, как и сегодня, нечувствительное к регистру совпадение невозможно https://cmake.org/pipermail/cmake/2017-May/065432.html – fferri

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