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

У нас есть набор кроссплатформенных сценариев сборки CMake, и мы поддерживаем сборку с помощью Visual C++ и GCC.

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

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

Ответ 1

Надежной проверкой является использование переменных 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. Чтобы проверить и Clang, предоставленный Apple, и обычный Clang, используйте следующее условие if:

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

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

Ответ 2

В исходном коде двигателя OGRE 3D используется check:

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

Ответ 3

Чтобы избежать какой-либо проблемы с неправильным использованием, я использую следующее:

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

Ответ 4

Это немного более подробный ответ для новичков cmake, модифицированный из ответа sakra, просто добавьте следующие строки в 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
...