Ligne de commande CMake pour C++ # define

J'ai besoin de compiler différentes versions d'un certain 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 les listes CMakeLists.fichier txt.

Dans ce projet spécifique cependant, Je ne suis pas autorisé à modifier les sources, y compris les CMakeLists.fichier 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 ne devrait pas avoir d'importance) qui inclut _MYDEFINE=1 dans ses définitions de préprocesseur mais en fait ce ne sera 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, à condition de changer les listes CMakeLists du projet.txt n'est pas nécessaire.

26
demandé sur Tim Meyer 2012-03-02 14:23:36

3 réponses

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

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

IF (NOT DEFINED _MYDEFINE)
    SET(_MYDEFINE <default value>)
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 change pas le comportement actuel de compilation sans drapeaux de compilateur supplémentaires et est donc un changement valide.

Et il vous permet de faire

cmake -D_MYDEFINE=<my value> <path to sources>

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

24
répondu Tim Meyer 2012-03-02 13:01:07

Conteneur CMakeLists.txt solution

Solution délicate:

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

Créez un nouveau CMakeList.txt en haut 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 utiliser votre nouveau projet (FAKE_PROJECT) pour compiler. Si le ReadOnlyProject ne définit pas directement les définitions des compilateurs, cela pourrait fonctionner.


Sur Visual Studio 2010:

Essayer de modifier c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props pour ajouter des paramètres du compilateur.

Vous devriez ajouter le suivi:

<Project>
  ...
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>
9
répondu Naszta 2012-03-02 16:37:12

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

$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..
0
répondu sakra 2018-09-20 13:40:24