首页 文章

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

提问于
浏览
111

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

我们正在尝试Clang,但我无法弄清楚如何测试编译器是否与我们的CMake脚本一起使用 .

我应该测试什么来查看编译器是否是Clang?我们目前正在使用MSVCCMAKE_COMPILER_IS_GNU<LANG>分别测试Visual C和GCC .

4 回答

  • 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,Apple提供的Clang的 CMAKE_<LANG>_COMPILER_ID 值现在为 AppleClang . 要测试Apple提供的Clang和常规Clang,请使用以下if条件:

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

    另见AppleClang policy description .

  • 0

    OGRE 3D引擎源代码使用以下check

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

    为了避免任何拼写错误的问题,我使用这个:

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

    为了使正则表达式不敏感,我尝试了所有事情here没有成功(似乎在CMake中不支持) .

  • 1

    这是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()
    

    然后在CMakeLists.txt所在的文件夹中运行 cmake . . 然后你会看到一堆输出和你的答案 .

    ...
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    GNU
    -- Configuring done
    -- Generating done
    ...
    

相关问题