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의 가치는AppleClang
Apple이 제공하는 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
'itsource' 카테고리의 다른 글
Vue.js[vuex] 변환에서 디스패치하는 방법 (0) | 2022.09.03 |
---|---|
C/C++에서 사람들이 하는 부당한 가정을 설명하기 위한 교육 도구에는 무엇이 있습니까? (0) | 2022.08.31 |
AX 분리 방법Vuex 스토어로부터의 IOS 요구 (0) | 2022.08.31 |
Alarm Manager 예시 (0) | 2022.08.31 |
Safari 폭(%) 계산이 잘못됨(부모로부터 1px 필러). (0) | 2022.08.31 |