CMake では、コンパイラが Clang かどうかをテストするにはどうすればよいですか?



クロスプラットフォームの CMake ビルド スクリプトのセットがあり、Visual C++ と GCC でのビルドをサポートしています。


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


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


答え:


信頼できるチェックは 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 の時点で CMAKE_<LANG>_COMPILER_ID Apple 提供の Clang の値が AppleClang になりました . Apple 提供の Clang と通常の Clang の両方をテストするには、次の if 条件を使用します。


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

AppleClang ポリシーの説明も参照してください。


CMake 3.15 では、clang-cl と通常の clang フロント エンドの両方のサポートが追加されました。変数 CMAKE_CXX_COMPILER_FRONTEND_VARIANT を調べることで、フロント エンドのバリアントを特定できます。 :


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

いくつかのコードの回答


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() 
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")   # using regular Clang or AppleClang endif() 
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_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()
if ("${CMAKE_CXX_COMPILER_ID}"
STREQUAL "MSVC") MESSAGE("MSVC") endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")   MESSAGE("MSVC") endif() 
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")   MESSAGE("MSVC") 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 ()
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()