itsource

CMake에서 컴파일러가 Clang인지 테스트하려면 어떻게 해야 하나요?

mycopycode 2022. 8. 31. 22:51
반응형

CMake에서 컴파일러가 Clang인지 테스트하려면 어떻게 해야 하나요?

크로스 플랫폼 CMake 빌드 스크립트 세트가 있으며 Visual C++GCC사용한 빌드를 지원합니다.

Clang을 테스트하고 있는데 컴파일러가 Clang인지 아닌지 CMake 스크립트를 사용하여 테스트하는 방법을 알 수 없습니다.

컴파일러가 Clang인지 아닌지를 확인하려면 무엇을 테스트해야 합니까?Visual C++와 GCC를 각각 및 를 사용하여 테스트하고 있습니다.

신뢰할 수 있는 검사는 변수를 사용하는 것입니다.예: 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애플이 제공하는 Clang의 가치는AppleClangApple이 제공하는 Clang과 일반 Clang을 모두 테스트하려면 다음 if 조건을 사용합니다.

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

AppleClang 정책 설명도 참조하십시오.

CMake 3.15쨍그랑-cl과 일반 쨍그랑 프론트 엔드 모두에 대한 지원을 추가했습니다.프론트 엔드 배리언트는 변수를 조사함으로써 판별할 수 있습니다.

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
    # using clang with clang-cl front end
  elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
    # using clang with regular front end
  endif()
endif()

이것은 사크라의 대답에서 수정한, cmake 뉴비들에 대한 조금 더 상세한 대답입니다.3.1의 최소 버전은 CMake가 인용된 "MSVC" 문자열을 처리하는 방법을 변경하기 때문에 중요합니다(정책 CMP0054에 따름).

cmake_minimum_required(VERSION 3.1)
project(MyProject CXX)

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_minimum_required VERSION이 3.1보다 작을 경우 따옴표로 둘러싸인 변수를 사용하여 컴파일러를 결정해야 합니다.STREQUAL명령어, 즉

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

인용된 내용이 마음에 들지 않으면MATCHES명령어:

if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  MESSAGE("MSVC")
endif()

cmake_disply_required VERSION >= 3.1을 지정하면 즐겁게 사용할 수 있습니다.STREQUAL따옴표 없음:

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

cmake 3.1 버전의 문제에 대해서는, https://cmake.org/cmake/help/latest/policy/CMP0054.html 를 참조해 주세요.

Clang을 테스트할 수 있으며 프런트엔드는 다음과 같습니다.

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") # clang-cl
    # ...
  elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") # clang native
    # ...
  endif()
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") # both
    # ...
endif()

오타를 방지하기 위해 다음과 같은 대소문자를 구분하지 않는 비교를 사용하고 있습니다.

string( TOLOWER "${CMAKE_CXX_COMPILER_ID}" COMPILER_ID )
if (COMPILER_ID STREQUAL "clang")
    set(IS_CLANG_BUILD true)
else ()
    set(IS_CLANG_BUILD false)
endif ()

의 정규식을 만들기 위해MATCHES대소문자를 구분하지 않고 모든 을 시도했지만 성공하지 못했습니다(CMake에서는 지원되지 않는 것 같습니다).

언급URL : https://stackoverflow.com/questions/10046114/in-cmake-how-can-i-test-if-the-compiler-is-clang

반응형