首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在CMake中,如何测试编译器是否为Clang?

在CMake中,如何测试编译器是否为Clang?
EN

Stack Overflow用户
提问于 2012-04-07 00:12:52
回答 5查看 85.9K关注 0票数 180

我们有一套cross-platform CMake build scripts,我们支持用Visual C++GCC构建。

我们正在试用Clang,但是我不知道如何测试编译器是否与我们的CMake脚本一致。

我应该测试什么来查看编译器是否是Clang?我们目前正在使用MSVCCMAKE_COMPILER_IS_GNU分别为Visual C++和GCC进行测试。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-07 23:07:58

一种可靠的检查是使用CMAKE__COMPILER_ID变量。例如,要检查C++编译器:

代码语言:javascript
复制
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的值现在是AppleClang。要同时测试Apple提供的Clang和常规Clang,请使用以下if条件:

代码语言:javascript
复制
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  # using regular Clang or AppleClang
endif()

另请参阅AppleClang policy description

CMake 3.15增加了对clang-cl和常规clang前端的支持。您可以通过检查变量CMAKE_CXX_COMPILER_FRONTEND_VARIANT来确定前端变量

代码语言:javascript
复制
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()
票数 292
EN

Stack Overflow用户

发布于 2018-09-02 18:05:17

这是一个针对cmake新手的更详细的答案,由sakra的答案修改而来。3.1的最低版本似乎很重要,因为它改变了CMake处理引用的"MSVC“字符串的方式(根据策略CMP0054)。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2020-08-21 11:17:15

如果您的cmake_minimum_required版本低于3.1,那么您必须使用带引号的变量来确定编译器,如果与STREQUAL命令一起使用,即

代码语言:javascript
复制
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

或者,如果您不喜欢引用的内容,可以使用MATCHES命令:

代码语言:javascript
复制
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  MESSAGE("MSVC")
endif()

如果您指定cmake_minimum_required VERSION >= 3.1,那么您可以愉快地使用不带引号的STREQUAL

代码语言:javascript
复制
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  MESSAGE("MSVC")
endif()

cmake 3.1版本问题记录在这里:https://cmake.org/cmake/help/latest/policy/CMP0054.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10046114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档