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