2010-02-05 12 views
16

Acabo de empezar a utilizar CMake para algunos proyectos personales y escolares, y me ha dejado perplejo un pequeño problema.Condicional CXX_FLAGS utilizando cmake basado en el compilador?

Digamos que estoy tratando de obtener una compilación de programas C++ bajo múltiples compiladores (g ++, cl y bcc32 en este caso). Tengo diferentes conmutadores de línea de comandos para cada compilador, y lo que estaba intentando hacer era básicamente crear un directorio gnu/ms/borland y crear CMake cosas allí (al ingresar los directorios y haciendo un cmake -DCMAKE_CXX_COMPILER=g++ ... en el gnu, directorio, por ejemplo).

En el CMakeLists.txt en el directorio de nivel superior, he intentado hacer algo en la línea de:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

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

Y así sucesivamente con elsifs para los otros compiladores, pero esto no parece funcionar correctamente - Deja caer el CXXFLAGS por completo. La línea funciona si hago el archivo completamente incondicional (es decir, simplemente asumo g ++ y uso g ++ flags.).

¿Qué estoy haciendo mal aquí, o hay una mejor manera de manejar este tipo de problema?

Respuesta

19

Hay un montón de pre-defined CMake variables dependiendo del compilador que está utilizando:

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

Si desea que sus opciones del compilador para anular y persisten en el CMakeCache generada:

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' es solo para g ++. El OP pide C++, correcto, pero es bueno saber que también hay 'CMAKE_COMPILER_IS_GNUCC' para evitar confusiones. – mloskot

Cuestiones relacionadas