2012-04-06 11 views
95

Mamy zestaw cross platform CMake build scripts, a my obsługujemy budynek z MSVC i GCC.W cmake, jak mogę sprawdzić, czy kompilator jest Clang?

Próbujemy uzyskać Clang, ale nie mogę dowiedzieć się, jak sprawdzić, czy kompilator jest Clang z naszego skryptu CMake.

Co należy przetestować, aby sprawdzić, czy kompilator jest Clang, czy nie? Aktualnie używamy MSVC i CMAKE_COMPILER_IS_GNU<LANG> do testowania odpowiednio dla MSVC i GCC.

+0

Możesz ustawić kompilator, ustawiając CMAKE_C_COMPILER i CMAKE_CXX_COMPILER na ścieżkę do clang lub clang ++. +1 za klang. – Zaffy

+0

Dlaczego powinno Cię to obchodzić? Clang jest bardzo podobny do GCC pod względem akceptowanych opcji kompilatora ... –

+0

@BasileStarynkevitch Ponieważ wspieraliśmy MSVC, musieliśmy wykryć Clanga, więc wiedzieliśmy, czy włączyć opcje podobne do GCC, czy opcje podobne do MSVC. Nie pamiętam zbyt długo, ale możliwe jest też, że używaliśmy opcji nie obsługiwanych przez Clanga. – leedm777

Odpowiedz

158

Wiarygodne sprawdzenie jest użycie CMAKE_<LANG>_COMPILER_ID zmienne. Na przykład, aby sprawdzić kompilator 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() 

one również działać prawidłowo, jeśli używany jest owinięcie kompilator jak ccache.

Od CMake 3.0.0 wartość CMAKE_<LANG>_COMPILER_ID dla Clanga dostarczanego przez Apple wynosi teraz AppleClang. Aby przetestować zarówno dla Apple przewidzianego Clang i regularnego Clang użyć następujących jeśli warunek:

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

Zobacz także AppleClang policy description.

+0

[Dokumentacja cmake] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_LANG_COMPILER_ID) stwierdza: "Jest używany do określenia kompilatora i może ulec zmianie" . W przeciwnym razie byłaby idealna :-( – leedm777

+0

To prawdopodobnie nie jest dobry pomysł, aby użyć rozwiązania opartego na 'CMAKE_CXX_COMPILER_ARG1', albo nie wydaje się być w ogóle udokumentowane – sakra

+15

od CMake 2.8.10, ta zmienna jest (wreszcie!) Udokumentowana. Zobacz: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID –

0

Ogr 3D kod źródłowy silnika wykorzystuje następujące check:

if (CMAKE_CXX_COMPILER MATCHES ".*clang") 
    set(CMAKE_COMPILER_IS_CLANGXX 1) 
endif() 
+3

To jest blisko, ale nie działa, gdy używasz [ccache] (http: // ccache .samba.org /) (tj. 'export CXX =" ccache clang ++ "') – leedm777

+4

Wystarczająco blisko, dam ci to. Użyłem 'if (" $ {CMAKE_CXX_COMPILER} $ {CMAKE_CXX_COMPILER_ARG1} "MECZE". * Clang ")' do obsługi skrzynki cache. – leedm777

+0

To nie działa dla mnie jako '$ {CMAKE_CXX_COMPILER} ==/Library/Developer/CommandLineTools/usr/bin/C++'. Przyjęta odpowiedź działa. –

0

Wystarczy, aby uniknąć wszelkich problemów mispelling używam to:

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

Do wykonywania sprawa regex nieczuły, próbowałem wszystkiego here bez powodzenia (nie wydaje się być obsługiwane w CMake).

+0

Rzeczywiście, podobnie jak dzisiaj, nieuwzględnianie wielkości liter nie jest możliwe https://cmake.org/pipermail/cmake/2017-May/065432.html – fferri

Powiązane problemy