2010-06-28 8 views
24

Ich arbeite gerade an der Verwendung von cmake, um einige Projekte zu erstellen, mit den Hauptplattformen Visual C++, MinGW GCC und Linux GCC. Beim Erstellen mit GCC muss ich die Compileroption -Wno-invalid-offsetof angeben.Wie man verschiedene Compiler-Optionen für verschiedene Compiler in cmake anwenden?

Meine aktuelle Lösung ist wie folgt ...

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 

Dies funktioniert, aber unter der Annahme, dass alle Generatoren außer den Visual Studio diejenigen mit gcc bauen ist offensichtlich unsicher. Zum einen gibt es IIRC-Generatoren für Borland-Compiler. Noch wichtiger ist, dass die Verwendung von make nicht immer die Verwendung von gcc bedeutet.

Andere Compiler, die ich verwenden werde, sind llvm-gcc und clang. Glücklicherweise, glaube ich, unterstützt sogar clang gcc-kompatible Optionen. Aber diese Logik ist nur so lange gut, solange der relevante Code niemals freigegeben wird.

Cmake scheint nach verfügbaren Compilern zu suchen und ein Makefile speziell für diesen Compiler zu generieren (wirft die Frage auf - warum nicht zumindest die Möglichkeit haben, das Projekt direkt zu erstellen, ohne die Notwendigkeit eines Mittelsmanns wie make?).

Das war der Fall, ich hatte gehofft, in meinen CMakeLists.txt-Dateien direkt für gcc testen zu können. Bisher kann ich jedoch keine geeignete Variable zum Testen oder irgendeine andere offensichtliche Lösung finden.

Ist das möglich?

Antwort

35

Um ein tragbares Build-System zu erstellen, ist es am besten, nicht auf Plattformen zu testen, sondern auf Funktionen zu testen.

Anstatt zu testen "ob Windows dann dies tun", Test für "wenn das -WNO-Invalid-Offsetof Flag funktioniert dann verwenden Sie es". Sie können mit dem CheckCCompilerFlag Modul, zum Beispiel das tun:

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

Für C++ gibt es eine ähnliche CheckCXXCompilerFlag mit einem check_cxx_compiler_flag(flag var) Befehl ist.

+1

Das ist perfekt! Eine irrelevante Sache, aber ... es gibt nicht viel Sinn, diese Option für C zu überprüfen, da es in C keinen ungültigen Offset gibt - das passiert nur in C++. – Steve314

+0

Das wusste ich nicht. In der Tat wusste ich nicht, was die Option war, aber es macht Sinn, da C nur POD-Typen hat http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. Und CMake ignoriert die Compiler-Warnung während des Tests - "wenn es kompiliert, funktioniert es". – richq

+0

Gibt es eine Möglichkeit, nach Kombinationen von Optionen zu suchen? Außerdem wollte ich keine Kompilierungswarnungen sicherstellen und suchte nach einer Möglichkeit, Warnungen zu untersuchen. – thoni56

Verwandte Themen