119

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

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

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

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

  • 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 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 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
  • Error: User Rate Limit Exceededcmake.org/pipermail/cmake/2017-May/065432.html

    от
  • Error: User Rate Limit Exceededif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()

    от
  • Error: User Rate Limit Exceededcmake.org/cmake/help/v2.8.10/…

    от
  • @BasileStarynkevitch Так как мы поддерживали MSVC, нам нужно было обнаружить Clang, чтобы мы знали, включать ли опции, подобные GCC, или опции, подобные MSVC. Это было слишком долго для меня, чтобы помнить, но также возможно, что мы использовали опции, не поддерживаемые Clang.

    от leedm777
  • @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
  • Вы можете установить компилятор, установив для CMAKE_C_COMPILER и CMAKE_CXX_COMPILER путь к clang или clang ++. +1 за лязг

    от Zaffy
  • Почему ты должен заботиться? Clang очень похож на GCC, с точки зрения принятых опций компилятора ...

    от Basile Starynkevitch
  • -1

    Это немного более подробный ответ для новичков в cmake

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

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

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

  • 1

    Исходный код движка OGRE 3D использует следующее

    проверять:

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