クロスプラットフォームのCMakeビルドスクリプトのセットがあり、VisualC++およびGCCを使用したビルドをサポートしています。
Clangを試していますが、CMakeスクリプトを使用してコンパイラがClangであるかどうかをテストする方法がわかりません。
コンパイラがClangであるかどうかを確認するには、何をテストする必要がありますか?現在、VisualC++とGCCをそれぞれ使用MSVC
してテストしています。CMAKE_COMPILER_IS_GNU<LANG>
クロスプラットフォームのCMakeビルドスクリプトのセットがあり、VisualC++およびGCCを使用したビルドをサポートしています。
Clangを試していますが、CMakeスクリプトを使用してコンパイラがClangであるかどうかをテストする方法がわかりません。
コンパイラがClangであるかどうかを確認するには、何をテストする必要がありますか?現在、VisualC++とGCCをそれぞれ使用MSVC
してテストしています。CMAKE_COMPILER_IS_GNU<LANG>
信頼できるチェックは、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()
これは、sakraの回答から変更された、cmake初心者向けのもう少し詳細な回答です。3.1の最小バージョンは、CMakeが引用符で囲まれた「MSVC」文字列を処理する方法を変更するため(ポリシーCMP0054に従って)重要であるように思われます。
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()
cmake_minimum_required VERSIONが3.1未満の場合、STREQUAL
コマンドと一緒に使用する場合は、引用符で囲まれた変数を使用してコンパイラを決定する必要があります。
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
MESSAGE("MSVC")
endif()
または、引用符で囲まれたものが気に入らない場合は、次のMATCHES
コマンドを使用できます。
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
MESSAGE("MSVC")
endif()
また、cmake_minimum_required VERSION> = 3.1を指定すると、STREQUAL
引用符なしで楽しく使用できます。
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
MESSAGE("MSVC")
endif()
cmake 3.1バージョンの問題については、https ://cmake.org/cmake/help/latest/policy/CMP0054.htmlに記載されています。
Clangをテストすると、次のようなフロントエンドになります。
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()
スペルミスの問題を回避するために、次のように大文字と小文字を区別しない比較を使用しています。
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 ()
MATCHES
大文字と小文字を区別しない正規表現を作成するために、ここですべてを試しましたが成功しませんでした(CMakeではサポートされていないようです)。