Вопрос по cmake, c++, c – В CMake, как я могу проверить, является ли компилятор Clang?

119

У нас есть наборкросс-платформенные сценарии сборки CMakeи мы поддерживаем строительство сVisual C ++ а такжеНКУ.

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

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

Почему ты должен заботиться? Clang очень похож на GCC, с точки зрения принятых опций компилятора ... Basile Starynkevitch
Вы можете установить компилятор, установив для CMAKE_C_COMPILER и CMAKE_CXX_COMPILER путь к clang или clang ++. +1 за лязг Zaffy
@BasileStarynkevitch - Clang притворяется, что оба__GNUC__ а также_MSC_VER, но он не может использовать те же программы, что и любой компилятор. Обнаружение LLVM Clang и Apple Clang имеет решающее значение для обеспечения того, чтобы код компилировался и выполнялся как ожидалось. Я так устал от работы с БС Кланга, мы простоbreak the compile on Windows, Мы приняли политику разрешать пользователям жаловаться в LLVM, чтобы разработчики Clang меняли свое поведение. Также смHow to tell Clang to stop pretending to be other compilers? jww
@BasileStarynkevitch Так как мы поддерживали MSVC, нам нужно было обнаружить Clang, чтобы мы знали, включать ли опции, подобные GCC, или опции, подобные MSVC. Это было слишком долго для меня, чтобы помнить, но также возможно, что мы использовали опции, не поддерживаемые Clang. leedm777

Ваш Ответ

4   ответа
-1

модифицированный из ответа Сакры, просто добавьте следующие строки вCMakeLists.txt:

if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  MESSAGE("Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  MESSAGE("GNU")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  MESSAGE("Intel")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

Тогда бегиcmake . в папке, где лежит CMakeLists.txt. Затем вы увидите кучу результатов вместе с вашим ответом.

...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...
190

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.0CMAKE_<LANG>_COMPILER_ID Значение для предоставленного Apple Clang теперьAppleClang, Чтобы проверить и Clang, предоставленный Apple, и обычный Clang, используйте следующее условие if:

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

Также см.Описание политики AppleClang.

Error: User Rate Limit ExceededCMAKE_CXX_COMPILER_IDError: User Rate Limit Exceededproject(Foo CXX).
Error: User Rate Limit Exceededcmake documentationError: User Rate Limit Exceeded leedm777
Error: User Rate Limit Exceededcmake.org/cmake/help/v2.8.10/…
Error: User Rate Limit ExceededAppleClangError: User Rate Limit Exceededcmake 3.0.0 released AppleClangError: User Rate Limit Exceededcmake --versionError: User Rate Limit Exceededcmake_minimum_required(VERSION 3.0.0)Error: User Rate Limit Exceeded3.0.0Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
1

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 ()

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

Error: User Rate Limit Exceededcmake.org/pipermail/cmake/2017-May/065432.html
1

проверять:

if (CMAKE_CXX_COMPILER MATCHES ".*clang")
    set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()
Error: User Rate Limit Exceededif ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")Error: User Rate Limit Exceeded leedm777
Error: User Rate Limit Exceeded${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededccacheError: User Rate Limit Exceededexport CXX="ccache clang++") leedm777

Похожие вопросы