web-dev-qa-db-ja.com

CMakeでは、コンパイラがClangであるかどうかをどのようにテストできますか?

一連の クロスプラットフォームCMakeビルドスクリプト があり、 Visual C++ および GCC を使用したビルドをサポートしています。

Clang を試していますが、CMakeスクリプトを使用してコンパイラがClangかどうかをテストする方法がわかりません。

コンパイラがClangかどうかを確認するには、何をテストする必要がありますか?現在、 MSVCCMAKE_COMPILER_IS_GNU<LANG> を使用して、それぞれVisual C++とGCCをテストしています。

127
leedm777

信頼できるチェックは、 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ポリシーの説明 も参照してください。

202
sakra

OGRE 3Dエンジンのソースコードは、次の check を使用します。

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

スペルミスの問題を避けるために、私はこれを使用しています:

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
Antonio