181

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

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

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

4

5 に答える 5

297

信頼できるチェックは、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()
于 2012-04-07T15:07:58.033 に答える
1

これは、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()
于 2018-09-02T10:05:17.197 に答える
1

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に記載されています。

于 2020-08-21T03:17:15.407 に答える
1

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()
于 2021-09-16T16:53:22.273 に答える
0

スペルミスの問題を回避するために、次のように大文字と小文字を区別しない比較を使用しています。

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ではサポートされていないようです)。

于 2016-11-17T11:26:28.157 に答える