Bei den oben genannten Versuchen werden Ihrer Datei / Ihrem Ziel weitere Flags hinzugefügt, anstatt wie erwartet zu überschreiben. Zum Beispiel aus den Dokumenten für Eigenschaften in Quelldateien - COMPILE_FLAGS :
Diese Flags werden der Liste der Kompilierungsflags hinzugefügt, wenn diese Quelldatei erstellt wird.
Sie sollten in der Lage sein, das -Weffc++Flag für foo.cpp zu kontern, indem Sie dies tun
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Dies sollte dazu führen, dass im Compiler-Befehl -Wno-effc++nachher hinzugefügt wird -Weffc++, und die letztere Einstellung gewinnt. Sie können den vollständigen Befehl anzeigen und überprüfen, ob dies tatsächlich der Fall ist
make VERBOSE=1
Abgesehen davon äußert sich einer der Betreuer der GNU C ++ Standard Library -Weffc++in dieser Antwort ziemlich negativ .
Ein weiterer Punkt ist, dass Sie add_definitionsin dem Sinne missbrauchen, dass Sie dies eher für Compiler-Flags als für die beabsichtigten Präprozessor-Definitionen verwenden.
Es wäre vorzuziehen, zu verwenden add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
oder für CMake-Versionen <3.0, um etwas mehr zu tun wie:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Als Antwort auf weitere Fragen in den Kommentaren unten glaube ich, dass es unmöglich ist , ein Flag in einer einzelnen Datei zuverlässig zu entfernen . Der Grund ist, dass für jede gegebene Quelldatei das COMPILE_OPTIONSund 1 vorhanden istCOMPILE_FLAGS des Ziels angewendet wird, diese jedoch in keiner der Eigenschaften für diese Quelldatei angezeigt werden.
Sie können versuchen, das Problemflag vom Ziel zu COMPILE_OPTIONSentfernen und es dann einzeln auf jede Quelle des Ziels anzuwenden und es bei Bedarf aus der spezifischen Quelldatei zu entfernen.
Dies kann zwar in vielen Szenarien funktionieren, weist jedoch einige Probleme auf.
Die Eigenschaften der First- Source-Dateien enthalten nicht COMPILE_OPTIONSnur COMPILE_FLAGS. Dies ist ein Problem, da das COMPILE_OPTIONSeines Ziels Generatorausdrücke enthalten kann , diese COMPILE_FLAGSjedoch nicht unterstützt. Sie müssten also Generatorausdrücke berücksichtigen, während Sie nach Ihrem Flag suchen, und Sie müssten möglicherweise sogar Generatorausdrücke "analysieren", wenn Ihr Flag in einem oder mehreren enthalten wäre, um zu sehen, ob es erneut auf die verbleibenden angewendet werden sollte Quelldaten.
Zweitens: Seit CMake v3.0 können Ziele angeben INTERFACE_COMPILE_OPTIONS. Dies bedeutet, dass eine Abhängigkeit Ihres Ziels die Ihres Ziels COMPILE_OPTIONSüber seine hinzufügen oder überschreiben kann INTERFACE_COMPILE_OPTIONS. Sie müssten also alle Abhängigkeiten Ihres Ziels rekursiv durchlaufen (keine besonders einfache Aufgabe, da die Liste LINK_LIBRARIESfür das Ziel auch Generatorausdrücke enthalten kann), um diejenigen zu finden, die das Problemflag anwenden, und versuchen, es aus diesen zu entfernen Ziele ' INTERFACE_COMPILE_OPTIONSauch.
In dieser Phase der Komplexität möchte ich einen Patch an CMake senden, um die Funktionalität zum bedingungslosen Entfernen eines bestimmten Flags aus einer Quelldatei bereitzustellen.
1: Beachten Sie, dass im Gegensatz zur COMPILE_FLAGSEigenschaft für Quelldateien die COMPILE_FLAGSEigenschaft für Ziele veraltet ist.