2010-02-05 5 views
16

Je viens de commencer à utiliser CMake pour des projets personnels et scolaires, et j'ai été surpris par un problème mineur. Disons que j'essaye d'obtenir un programme C++ compilant sous plusieurs compilateurs (g ++, cl, et bcc32 dans ce cas). J'ai différents commutateurs de ligne de commande pour chaque compilateur, et ce que j'essayais de faire était de créer un répertoire gnu/ms/borland et de créer des trucs CMake (en entrant les répertoires et en faisant un cmake -DCMAKE_CXX_COMPILER=g++ .. dans le gnu, répertoire, par exemple).CXX_FLAGS conditionnel utilisant cmake basé sur le compilateur?

Dans le CMakeLists.txt sur le répertoire de haut niveau, j'ai essayé de faire quelque chose le long des lignes de:

if(CMAKE_CXX_COMPILER STREQUAL g++) 

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

Et ainsi de suite avec elsifs pour les autres compilateurs, mais cela ne semble pas fonctionner correctement - Il laisse tomber le CXXFLAGS entièrement. La ligne fonctionne si je rend le fichier complètement inconditionnel (par exemple, supposons g ++ et utilise des drapeaux g ++.). Qu'est-ce que je fais de mal ici, ou y a-t-il une meilleure façon de gérer ce genre de problème?

Répondre

19

Il y a un tas de pre-defined CMake variables selon le compilateur que vous utilisez:

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 vous voulez que vos options de compilateur de passer outre et persistent dans le CMakeCache produit:

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

Remarque, ' CMAKE_COMPILER_IS_GNUCXX' est pour g ++ seulement. L'OP demande C++, mais il est bon de savoir qu'il y a aussi 'CMAKE_COMPILER_IS_GNUCC' pour éviter les confusions. – mloskot

Questions connexes