Je voudrais utiliser un ensemble global d'indicateurs pour compiler un projet, ce qui signifie que dans mon fichier CMakeLists.txt de niveau supérieur, j'ai spécifié:
ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x )
Cependant, pour un fichier spécifique (disons "foo.cpp") dans un sous-répertoire, je veux changer les drapeaux de compilation pour ne pas appliquer -Weffc ++ (bibliothèque commerciale incluse que je ne peux pas changer). Pour simplifier la situation pour n'utiliser que -Wall, j'ai essayé:
SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
, qui n'a pas fonctionné. J'ai aussi essayé
SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
et
ADD_EXECUTABLE( foo foo.cpp )
SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall )
, dans lequel ni l'un ni l'autre n'a fonctionné.
Enfin, j'ai essayé de supprimer cette définition:
REMOVE_DEFINITIONS( -Weffc++ )
ADD_EXECUTABLE( foo foo.cpp )
ADD_DEFINITIONS( -Weffc++ )
, qui ne fonctionnait pas non plus (ce qui signifie que je reçois beaucoup d'avertissements de style concernant la bibliothèque commerciale). (** Remarque: les avertissements SONT supprimés si JE NE ré-inclue PAS la directive -Weffc ++ après la construction de l'exécutable.)
J'ai également essayé de supprimer temporairement les indicateurs de compilation: http://www.cmake.org/pipermail/cmake/2007-June/014614.html , mais cela n'a pas aidé.
N'y a-t-il pas une solution élégante à cela?
la source
Réponses:
Vos tentatives ci-dessus ajoutent d'autres indicateurs à votre fichier / cible au lieu d'écraser comme vous semblez vous y attendre. Par exemple, à partir de la documentation relative aux propriétés sur les fichiers source - COMPILE_FLAGS :
Vous devriez pouvoir
-Weffc++
annuler l' indicateur pour foo.cpp en faisantCela devrait avoir pour effet d'ajouter
-Wno-effc++
après-Weffc++
dans la commande du compilateur, et le dernier paramètre l'emporte. Pour voir la commande complète et vérifier que c'est bien le cas, vous pouvez faireEn aparté, l' un des mainteneurs de la bibliothèque standard GNU C ++ présente un avis joli négatif sur
-Weffc++
dans cette réponse .Un autre point est que vous faites une mauvaise utilisation
add_definitions
dans le sens où vous l'utilisez pour les indicateurs de compilateur plutôt que pour les définitions de préprocesseur prévues.Il serait préférable d'utiliser
add_compile_options
ou pour les versions de CMake <3.0 pour faire quelque chose de plus comme:
En réponse à d'autres questions dans les commentaires ci-dessous, je pense qu'il est impossible de supprimer de manière fiable un indicateur sur un seul fichier. La raison en est que pour un fichier source donné, le
COMPILE_OPTIONS
et 1 de sa cible sont appliqués, mais ceux-ci n'apparaissent dans aucune des propriétés de ce fichier source.COMPILE_FLAGS
Vous pouvez envisager de supprimer l'indicateur de problème de la cible
COMPILE_OPTIONS
, puis de l'appliquer à chacune des sources de la cible individuellement, en l'omettant du fichier source spécifique si nécessaire.Cependant, bien que cela puisse fonctionner dans de nombreux scénarios, cela pose quelques problèmes.
Premièrement, les propriétés des fichiers source n'incluent pas
COMPILE_OPTIONS
, seulementCOMPILE_FLAGS
. C'est un problème car leCOMPILE_OPTIONS
d'une cible peut inclure des expressions de générateur , maisCOMPILE_FLAGS
ne les prend pas en charge. Vous devrez donc prendre en compte les expressions du générateur lors de la recherche de votre indicateur, et en fait vous devrez peut-être même "analyser" les expressions du générateur si votre indicateur était contenu dans un ou plusieurs pour voir s'il devrait être réappliqué au reste fichiers source.Deuxièmement - depuis CMake v3.0, les cibles peuvent spécifier
INTERFACE_COMPILE_OPTIONS
. Cela signifie qu'une dépendance de votre cible peut ajouter ou remplacer votre cibleCOMPILE_OPTIONS
via sonINTERFACE_COMPILE_OPTIONS
. Vous devrez donc en outre parcourir de manière récursive toutes les dépendances de votre cible (ce n'est pas une tâche particulièrement facile puisque la liste desLINK_LIBRARIES
pour la cible peut également contenir des expressions de générateur) pour trouver celles qui appliquent l'indicateur de problème, et essayez de la supprimer de celles-ci. cibles »INTERFACE_COMPILE_OPTIONS
aussi.À ce stade de complexité, je chercherais à soumettre un correctif à CMake pour fournir la fonctionnalité permettant de supprimer un indicateur spécifique sans condition d'un fichier source.
1: Notez que contrairement à la
COMPILE_FLAGS
propriété sur les fichiers sources, laCOMPILE_FLAGS
propriété sur les cibles est obsolète.la source
Juste ajouter à la bonne réponse de @ Fraser.
Dans le cas où vous souhaitez ajouter l'indicateur spécial à des dossiers spécifiques, vous pouvez faire:
ou
Notez qu'il n'est pas recommandé d'utiliser GLOB comme indiqué ici
la source
En utilisant @Fraser answer, j'ai créé ce qui suit pour gérer les inclusions Qt car la variable comprend plusieurs chemins séparés par des points-virgules. Cela signifie que je devais d'abord ajouter une
foreach()
boucle et créer les indicateurs d'inclusion à la main . Mais cela me permet d'avoir une exception: foo.cpp (ce fichier utilise Qt pour l'instant mais à long terme, je veux supprimer cette dépendance et je veux m'assurer que Qt ne s'infiltre nulle part ailleurs).Notez également que j'utilise au
-isystem
lieu de-I
pour éviter certains avertissements générés par les en-têtes Qt (j'ai une tonne d'avertissements activés).la source