2010-02-05 9 views
16

Ho appena iniziato a utilizzare CMake per alcuni progetti personali e scolastici e sono stato perplesso da un problema minore.CXX_FLAGS condizionale che utilizza cmake in base al compilatore?

Diciamo che sto cercando di ottenere un programma C++ compilato sotto più compilatori (g ++, cl e bcc32 in questo caso). Ho diversi switch a linea di comando per ogni compilatore, e quello che stavo tentando di fare era fondamentalmente creare una directory gnu/ms/borland e creare elementi di CMake (inserendo le directory e facendo un .. nello gnu, directory, per esempio).

Nel CMakeLists.txt sulla directory di primo livello, ho provato a fare qualcosa sulla falsariga di:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

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

E così via con elsifs per gli altri compilatori, ma questo non sembra funzionare correttamente - lascia cadere completamente il CXXFLAGS. La linea funziona se faccio il file completamente incondizionato (cioè, si assuma semplicemente g ++ e si usi flag g ++.).

Che cosa sto facendo male qui, o c'è un modo migliore per gestire questo tipo di problema?

risposta

19

Ci sono un sacco di pre-defined CMake variables a seconda del compilatore che si sta utilizzando:

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

Se si desidera che il compilatore opzioni per ignorare e persistono nel CMakeCache generato:

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

nota, ' CMAKE_COMPILER_IS_GNUCXX' è solo per g ++. L'OP chiede C++, giusto, ma è bene sapere che c'è anche 'CMAKE_COMPILER_IS_GNUCC' per evitare confusioni. – mloskot

Problemi correlati