Mamy zestaw wieloplatformowych skryptów kompilacji CMake i wspieramy budowanie za pomocą Visual C ++ i GCC .
Próbujemy Clang , ale nie mogę dowiedzieć się, jak sprawdzić, czy kompilator jest Clang z naszym skryptem CMake.
Co powinienem przetestować, aby sprawdzić, czy kompilator jest Clang, czy nie? Obecnie używamy MSVC
i CMAKE_COMPILER_IS_GNU<LANG>
do testowania odpowiednio dla Visual C ++ i GCC.
__GNUC__
i_MSC_VER
, ale nie może używać tych samych programów co żaden z kompilatorów. Wykrywanie LLVM Clang i Apple Clang ma kluczowe znaczenie dla zapewnienia, że kod kompiluje się i uruchamia zgodnie z oczekiwaniami. Jestem tak zmęczony radzeniem sobie z BS Clanga, że po prostu przerywamy kompilację w systemie Windows . Przyjęliśmy zasadę pozwalającą użytkownikom na składanie skarg do LLVM, aby deweloperzy Clang zmienili swoje zachowanie. Zobacz także Jak powiedzieć Clangowi, aby przestał udawać inne kompilatory?Odpowiedzi:
Wiarygodnym sprawdzeniem jest użycie
CMAKE_<LANG>_COMPILER_ID
zmiennych. Na przykład, aby sprawdzić kompilator C ++:Te również działają poprawnie, jeśli używana jest otoka kompilatora, taka jak pamięć podręczna .
Począwszy od CMake 3.0.0,
CMAKE_<LANG>_COMPILER_ID
wartość Clang dostarczonego przez Apple wynosi terazAppleClang
. Aby przetestować zarówno Clang dostarczony przez Apple, jak i zwykły Clang, użyj następującego warunku if:Zobacz także opis zasad AppleClang .
CMake 3.15 dodał obsługę zarówno dla clang-cl, jak i dla zwykłego clang. Możesz określić wariant interfejsu użytkownika, sprawdzając zmienną
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:źródło
CMAKE_CXX_COMPILER_ID
zmienna jest dostępna tylko po poleceniuproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
dokładnie wykryć , @sakra wskazuje, że zostałcmake 3.0.0
wydanyAppleClang
. Jednak tylko dlatego, żecmake --version
raporty równe lub wyższe nie wystarczą - musisz to zrobićcmake_minimum_required(VERSION 3.0.0)
, aby3.0.0
standardy były używane!Kod źródłowy silnika OGRE 3D wykorzystuje następujące sprawdzenie :
źródło
export CXX="ccache clang++"
)if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
zajmowałem się sprawą pamięci podręcznej.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. Zaakceptowana odpowiedź działa.Aby uniknąć problemów z pisownią, używam porównania bez rozróżniania wielkości liter, na przykład:
Aby uczynić regex bez
MATCHES
rozróżniania wielkości liter, próbowałem tutaj wszystkiego bez powodzenia (nie wydaje się być obsługiwane w CMake).źródło
To jest nieco bardziej szczegółowa odpowiedź dla nowicjuszy cmake, zmodyfikowana z odpowiedzi Sakry, po prostu dołącz następujące wiersze do
CMakeLists.txt
:Następnie uruchom
cmake .
w folderze, w którym znajduje się CMakeLists.txt. Następnie zobaczysz kilka wyników wraz z odpowiedzią.źródło