web-dev-qa-db-fra.com

Comment définir une macro de préprocesseur C ++ via la 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 ni défini lors de la compilation, ni le 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 puis-je le faire?

30
ybungalobill

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

  • Appelez CMake comme d'habitude, pas de drapeaux spéciaux.

  • Ensuite:

    • Avec MSVC: Le compilateur lit la variable d'environnement CL pour obtenir des arguments de ligne de commande supplémentaires. Alors

      set CL=/DMY_MACRO=1 %CL%
      

      puis appelez MSBuild pour faire son travail.

    • Avec d'autres chaînes d'outils: Cela pourrait être faisable en définissant les variables d'environnement CFLAGS ou CXXFLAGS avant d'appeler make, mais je n'ai pas vérifié cela.

4
ybungalobill

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)

Ensuite, vous pouvez activer/désactiver cette option via la ligne de commande avec cmake en utilisant le -D drapeau. Exemple:

cmake -DDEFINE_MACRO=OFF ..

Pour vous assurer que le compilateur reçoit correctement 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 également une bonne solution car make recompilera votre code lorsque l'une des options de cmake change.

21
freitass

Essaye ça: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

10
SlavaNov