Ligne de commande CMake pour C ++ #define

J’ai besoin de comstackr différentes versions d’un projet en ajoutant des commutateurs de compilateur. Habituellement, je le ferais en utilisant add_definitions ou quelque chose comme

set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 ) 

dans le fichier CMakeLists.txt.

Cependant, dans ce projet spécifique, je ne suis pas autorisé à modifier les sources, y compris le fichier CMakeLists.txt .

J’espérais que quelque chose comme

 cmake -D_MYDEFINE=1  

générerait un fichier de projet (Visual Studio 2008 dans mon cas, mais cela n’aurait pas d’importance), qui inclut _MYDEFINE = 1 dans ses définitions de pré-processeur, mais ce n’est pas le cas.

Quelles sont mes options ici? Existe-t-il une option de ligne de commande cmake différente pour y parvenir? N’hésitez pas à suggérer des solutions n’incluant pas la ligne de commande, tant que changer le fichier CMakeLists.txt du projet n’est pas nécessaire.

J’ai réussi à le faire de cette façon maintenant:

J’ai réussi à convaincre tout le monde d’append les lignes suivantes au fichier CMakeLists.txt commun:

 IF (NOT DEFINED _MYDEFINE) SET(_MYDEFINE ) ENDIF() ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE}) 

(Non, ce n’est pas vraiment appelé “MYDEFINE”, et est juste un espace réservé, je viens de remplacer tout cela pour cet exemple)

Cela ne modifie pas le comportement actuel de la compilation sans aucun indicateur de compilateur supplémentaire et constitue donc un changement valide.

Et cela vous permet de faire

 cmake -D_MYDEFINE=  

où cette définition de cmake sera mappée à une définition de précompilateur C ++ lorsque cmake crée le fichier de projet.

Container CMakeLists.txt solution

Solution délicate:

Votre chemin d’access CMakeList.txt lecture seule: ${path}/ReadOnlyProject/CMakeLists.txt

Créez un nouveau CMakeList.txt en CMakeList.txt de la bibliothèque en lecture seule ( ${path}/CMakeLists.txt ):

 CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) PROJECT (FAKE_PROJECT) ADD_DEFINITIONS(-D_MYDEFINE=1) ADD_SUBDIRECTORY(ReadOnlyProject) 

Maintenant, utilisez votre nouveau projet ( FAKE_PROJECT ) pour comstackr. Si ReadOnlyProject ne définit pas directement les définitions des compilateurs, cela pourrait fonctionner.


Sur Visual Studio 2010:

Essayez de modifier c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props pour append des parameters de compilateur personnalisés.

Vous devriez append ce qui suit:

  ...   __MYDEFINE=1;%(PreprocessorDefinitions)    

Pour passer une définition de pré-processeur C ++ ou C sans modifier aucun fichier source CMake, utilisez les variables d’environnement CFLAGS pour C ou CXXFLAGS pour C ++, par exemple:

 $ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1" $ mkdir build $ cd build $ cmake ..