2010-06-28 3 views
24

Obecnie pracuję nad wykorzystaniem cmake do budowania niektórych projektów, a głównymi platformami są Visual C++, MinGW GCC i Linux GCC. Podczas budowania z GCC, muszę określić opcję kompilatora -Wno-invalid-offsetof.Jak zastosować różne opcje kompilatora dla różnych kompilatorów w cmake?

Mój obecny dylemat jest następujący ...

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

To działa, ale przy założeniu, że wszystkie generatory, inne niż te, które wizualnych studio zbuduje z gcc jest oczywiście niebezpieczne. Na początek są generatory IIRC dla kompilatorów Borlanda. Co ważniejsze, używanie make nie zawsze oznacza używanie gcc.

Inne kompilatory, których prawdopodobnie używam, to llvm-gcc i clang. Na szczęście myślę, że nawet clang obsługuje opcje kompatybilne z gcc. Ale ta logika jest dobra tylko tak długo, jak długo odpowiedni kod nigdy nie zostanie zwolniony.

Pojawi się Cmake, aby sprawdzić dostępne kompilatory i wygenerować plik Makefile specjalnie dla tego kompilatora (podnosząc pytanie - dlaczego nie ma co najmniej opcji bezpośredniego budowania projektu, bez potrzeby stosowania pośrednika takiego jak marka?).

W tym przypadku miałem nadzieję, że będę mógł testować bezpośrednio dla gcc w moich plikach CMakeLists.txt. Do tej pory jednak nie mogę znaleźć odpowiedniej zmiennej do przetestowania ani żadnego innego oczywistego rozwiązania.

Czy to możliwe?

Odpowiedz

35

Aby utworzyć przenośny system kompilacji, najlepiej nie testować platform, ale testować funkcje.

Zamiast testować "jeśli system Windows to zrobi", przetestuj "jeśli flaga -Wno-invalid-offsetof działa, użyj go". Można to zrobić za pomocą modułu CheckCCompilerFlag, na przykład:

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

dla C++ istnieje podobna CheckCXXCompilerFlag poleceniem check_cxx_compiler_flag(flag var).

+1

To jest idealne! Jedną nieistotną rzeczą, choć ... nie ma sensu sprawdzanie tej opcji dla C, ponieważ nie ma czegoś takiego jak nieprawidłowa wartość przesunięcia w C - zdarza się to tylko w C++. – Steve314

+0

Nie wiedziałem o tym. Właściwie nie wiedziałem, do czego służy ta opcja, ale ma to sens, ponieważ C ma tylko typy POD http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. A CMake ignoruje ostrzeżenie kompilatora podczas testu - "jeśli kompiluje działa". – richq

+0

Czy istnieje sposób sprawdzenia kombinacji opcji? Poza tym chciałem się upewnić, że nie ma ostrzeżeń o kompilacji, więc szukałem sposobu na zbadanie ostrzeżeń. – thoni56