42 votes

Comment définir une macro de préprocesseur C++ en ligne de commande avec CMake ?

J'essaie de définir une macro de préprocesseur dans la ligne de commande de CMake. J'ai essayé :

set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project

mais il n'est pas défini lors de la compilation et je ne trouve pas son nom MY_MACRO dans les fichiers générés par CMake, à l'exception de CMakeCache.txt où il est présent dans le formulaire :

MY_MACRO:UNINITIALIZED=1

Comment faire ?

35voto

freitass Points 2488

Une bonne alternative serait de définir une option cmake :

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default

Suivi d'une condition :

IF(DEFINE_MACRO)
    ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)

Vous pouvez alors activer/désactiver cette option en ligne de commande avec cmake en utilisant l'option -D drapeau. Exemple :

cmake -DDEFINE_MACRO=OFF ..

Pour s'assurer que le compilateur reçoit bien la définition, vous pouvez appeler make en mode verbeux et vérifier si la macro est définie ou non :

make VERBOSE=1

C'est aussi une bonne solution parce que make recompile votre code lorsque l'une des options de cmake est modifiée.

17voto

SlavaNov Points 1577

Essayez ceci : -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

15voto

ybungalobill Points 31467

La motivation derrière la question était de construire par lots des bibliothèques tierces, c'est pourquoi je voulais éviter de modifier les CMakeLists. Des années plus tard, même si je n'en ai plus besoin, j'ai compris que c'est facilement réalisable en signifie externe à CMake :

  • Invoque CMake comme d'habitude, sans drapeaux spéciaux.

  • Ensuite :

    • Avec MSVC : Le compilateur lit le CL pour obtenir des arguments de ligne de commande supplémentaires. Il s'agit d'une

        set CL=/DMY_MACRO=1 %CL%

      puis invoquer MSBuild pour qu'il fasse son travail.

    • Avec Makefiles : Les makefiles générés utilisent la méthode CFLAGS y CXX_FLAGS comme les makefiles sont censés le faire. Ainsi, la construction peut être lancée par

        make CXX_FLAGS=-DMY_MACRO=1

      ou en définissant les variables d'environnement correspondantes.

-6voto

hiobs Points 566

Sauf si vous avez une bonne raison ne pas vous devez utiliser ADD_DEFINITIONS(<name>=<value>[, ...]) .

Il suffit d'ajouter la ligne suivante à votre fichier CMakeLists.txt :

ADD_DEFINITIONS("MY_MACRO=1")

CMake s'occupera de la syntaxe des commutateurs (qu'il s'agisse de -D<name>=<value> ou /D<name>=<value> ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X