2010-02-05 8 views
16

Ich habe gerade begonnen, CMake für einige persönliche und schulische Projekte zu verwenden, und ich bin durch ein kleines Problem ratlos.Bedingte CXX_FLAGS mit Cmake basierend auf Compiler?

Angenommen, ich versuche, ein C++ - Programm kompilieren unter mehreren Compilern (in diesem Fall g ++, cl und bcc32). Ich habe verschiedene Befehlszeilenschalter für jeden Compiler, und was ich zu tun versuchte, war im Grunde ein gnu/ms/borland-Verzeichnis zu erstellen und CMake Zeug dort (durch Eingabe der Verzeichnisse und eine cmake -DCMAKE_CXX_COMPILER=g++ .. im gnu, Verzeichnis, zum Beispiel).

Im CMakeLists.txt auf der obersten Ebene, versuchte ich etwas entlang der Linien von:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

    set(CMAKE_CXX_FLAGS "-Wextra -Wall -ansi -pedantic") 

Und so weiter mit elsifs für die anderen Compiler, aber dies scheint nicht richtig zu funktionieren - Es lässt die CXXFLAGS vollständig fallen. Die Zeile funktioniert, wenn ich die Datei vollständig bedingungslos mache (dh nehme einfach g ++ an und verwende g ++ - Flags).

Was mache ich hier falsch, oder gibt es einen besseren Weg, um mit dieser Art von Problem umzugehen?

Antwort

19

Es gibt eine Reihe von pre-defined CMake variables auf dem Compiler ab, die Sie verwenden:

if (MSVC) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGSS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

if (BORLAND) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

if (CMAKE_COMPILER_IS_GNUCXX) 
    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE") 
    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE") 
endif() 

Wenn Sie Ihre Compiler-Optionen in der generierten CMakeCache außer Kraft zu setzen und anhalten:

if (CMAKE_COMPILER_IS_GNUCXX) 

    set (CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for All Builds" FORCE) 

    set (CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for Debug Builds" FORCE) 

    set (CMAKE_CXX_FLAGS_RELEASE "/RELEASE_FLAGS_GO_HERE" 
     CACHE STRING "g++ Compiler Flags for Release Builds" FORCE) 

endif() 
+4

Hinweis, ' CMAKE_COMPILER_IS_GNUCXX' ist nur für g ++. Das OP fragt nach C++, richtig, aber es ist gut zu wissen, dass es auch 'CMAKE_COMPILER_IS_GNUCC 'gibt, um Verwirrungen zu vermeiden. – mloskot