web-dev-qa-db-fra.com

Ligne de commande CMake pour C++ #define

J'ai besoin de compiler 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 <path to sources>

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.

26
Tim Meyer

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

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

IF (NOT DEFINED _MYDEFINE)
    SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})

(Non, ce n'est pas vraiment appelé "MYDEFINE", et <valeur par défaut> 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=<my value> <path to sources>

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

24
Tim Meyer

Container CMakeLists.txt solution

Solution délicate:

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

Créez un nouveau CMakeList.txt au-dessus 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 compiler. Si la 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 ajouter des paramètres de compilateur personnalisés.

Vous devriez ajouter ce qui suit:

<Project>
  ...
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>
9
Naszta

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 ..
1
sakra