一連の クロスプラットフォーム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現在、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ポリシーの説明 も参照してください。
OGRE 3Dエンジンのソースコードは、次の check を使用します。
if (CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()
スペルミスの問題を避けるために、私はこれを使用しています:
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ではサポートされていないようです)。