Remplacer compiler flags pour les fichiers unique
Je voudrais utiliser un ensemble global de drapeaux pour la compilation d'un projet, ce qui signifie qu'à mon top niveau CMakeLists.txt fichier 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 passer à la
compiler flags de ne pas appliquer d'-Weffc++ (inclus commercial de la bibliothèque je ne peux pas changer). Pour simplifier la situation pour utiliser uniquement le Mur, j'ai essayé:
SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
qui n'a pas de travail.
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 )
ni travaillé.
Enfin, j'ai essayé de supprimer cette définition:
REMOVE_DEFINITIONS( -Weffc++ )
ADD_EXECUTABLE( foo foo.cpp )
ADD_DEFINITIONS( -Weffc++ )
qui n'a pas de travail (ce qui signifie, je reçois beaucoup de style de mises en garde à propos de la bibliothèque commerciale).
(**Note: Les mises en garde SONT supprimées si je N'ai PAS ré-inclure le -Weffc++ directive après la construction de l'exécutable.)
J'ai aussi essayé de supprimer temporairement le compiler flags:
http://www.cmake.org/pipermail/cmake/2007-June/014614.html
mais cela n'a pas aidé.
Est-il pas une solution élégante à ce?
- Attendez, si votre dernière tentative d'œuvres, mais seulement après qu'il est construit, ne serait-ce pas un problème de mise en cache? Essayez de supprimer CMakeCache après avoir fait votre changement(s).
- Connexes, voir Comment faire pour modifier un compilateur drapeau pour juste un exécutable dans CMake? Andre réponse montre ce qui semble être un moyen de remplacer les options existantes avec de nouvelles options.
Vous devez vous connecter pour publier un commentaire.
Votre tente au-dessus ajoutez d'autres drapeaux à votre fichier/cible plutôt que de les écraser comme vous semblez attendre. Par exemple, à partir de la documentation pour Propriétés de la Source des Fichiers - COMPILE_FLAGS:
Vous devriez être en mesure de faire annuler la
-Weffc++
drapeau pour foo.cpp en faisantCe qui devrait avoir pour effet d'ajouter
-Wno-effc++
après-Weffc++
dans la commande du compilateur, et la dernière configuration wins. Pour voir l'intégralité de la commande et vérifier que c'est effectivement le cas, vous pouvez le faireQue d'un côté, l'un des responsables de la GNU Standard C++ Library présente un joli avis négatif sur
-Weffc++
dans cette réponse.Un autre point est que vous êtes mauvais usage de
add_definitions
dans le sens que vous utilisez ce pour les drapeaux de compilation et non à l'définitions de préprocesseur.Il serait préférable d'utiliser
add_compile_options
ou pour CMake versions < 3.0 à faire quelque chose de plus comme:
En réponse à d'autres questions dans les commentaires ci-dessous, je crois qu'il est impossible de manière fiable supprimer un drapeau sur un seul fichier. La raison en est que pour chaque fichier source, il a le
COMPILE_OPTIONS
etCOMPILE_FLAGS
1 de sa cible appliquées, mais elles ne s'affichent pas dans l'une des propriétés de ce fichier source.Vous pouviez regarder le décapage, le problème drapeau de la cible
COMPILE_OPTIONS
, puis en l'appliquant à chacune des sources individuellement, en omettant de la source de fichier requis.Cependant, alors que cela pourrait fonctionner dans de nombreux scénarios, il a quelques problèmes.
Première source des fichiers de propriétés ne comprennent pas
COMPILE_OPTIONS
, seulementCOMPILE_FLAGS
. C'est un problème parce que leCOMPILE_OPTIONS
d'une cible peut inclure générateur d'expressions, maisCOMPILE_FLAGS
ne les supporte pas. Donc, vous avez à accueillir générateur d'expressions lors de la recherche de votre drapeau, et en effet, vous auriez peut-être même avoir à "analyser" générateur d'expressions si votre drapeau a été contenue dans un ou plus pour voir si elle doit être ré-appliqué à la source des fichiers.Deuxième depuis CMake v3.0, les objectifs peuvent spécifier
INTERFACE_COMPILE_OPTIONS
. Cela signifie qu'une dépendance de votre cible peut ajouter ou de remplacer votre cibleCOMPILE_OPTIONS
par l'intermédiaire de sonINTERFACE_COMPILE_OPTIONS
. Donc, si vous voulez plus d'avoir de façon récursive itérer sur tous vos cibles dépendances (pas particulièrement facile puisque la liste deLINK_LIBRARIES
pour la cible peut également contenir générateur d'expressions) pour trouver tout ce qui s'applique le problème drapeau et essayer de supprimer à partir de ces ciblesINTERFACE_COMPILE_OPTIONS
trop.À ce stade de la complexité, je serais à la recherche de soumettre un patch pour CMake pour fournir la fonctionnalité pour supprimer un indicateur spécifique de manière inconditionnelle à partir d'un fichier source.
1: Noter que, contrairement à la
COMPILE_FLAGS
de propriété sur les fichiers sources, lesCOMPILE_FLAGS
de propriété sur les cibles est obsolète.Juste en ajoutant à @Fraser réponse correcte.
Dans le cas où si vous souhaitez ajouter le drapeau spécial pour des dossiers spécifiques que vous pouvez faire:
ou
Remarque qu'il n'est pas recommandé d'utiliser GLOB comme discuté ici