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 :
Ces indicateurs seront ajoutés à la liste des indicateurs de compilation lors de la construction de ce fichier source.
Vous devriez pouvoir -Weffc++
annuler l' indicateur pour foo.cpp en faisant
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Cela 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 faire
make VERBOSE=1
En 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
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
ou pour les versions de CMake <3.0 pour faire quelque chose de plus comme:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
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
, seulement COMPILE_FLAGS
. C'est un problème car le COMPILE_OPTIONS
d'une cible peut inclure des expressions de générateur , mais COMPILE_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 cible COMPILE_OPTIONS
via son INTERFACE_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 des LINK_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, la COMPILE_FLAGS
propriété sur les cibles est obsolète.