I tuoi tentativi precedenti stanno aggiungendo ulteriori flag al tuo file / destinazione invece di sovrascriverli come ti aspetti. Ad esempio, dalla documentazione relativa alle proprietà sui file di origine - COMPILE_FLAGS :
Questi flag verranno aggiunti all'elenco dei flag di compilazione quando questo file sorgente viene compilato.
Dovresti essere in grado di -Weffc++
annullare il flag per foo.cpp facendo
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Questo dovrebbe avere l'effetto di aggiungere -Wno-effc++
dopo -Weffc++
nel comando del compilatore e quest'ultima impostazione ha la meglio. Per vedere il comando completo e verificare che sia effettivamente così, puoi farlo
make VERBOSE=1
Per inciso, uno dei manutentori della GNU C ++ Standard Library presenta un'opinione piuttosto negativa -Weffc++
in questa risposta .
Un altro punto è che stai abusando add_definitions
nel senso che stai usando questo per i flag del compilatore piuttosto che per le definizioni del preprocessore previste.
Sarebbe preferibile utilizzare add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
o per le versioni di CMake <3.0 per fare qualcosa di più come:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
In risposta ad ulteriori domande nei commenti seguenti, credo che sia impossibile rimuovere in modo affidabile un flag su un singolo file. Il motivo è che per ogni dato file sorgente, ha il COMPILE_OPTIONS
e 1COMPILE_FLAGS
applicato della sua destinazione, ma questi non vengono visualizzati in nessuna delle proprietà per quel file di origine.
Potresti provare a rimuovere il flag del problema da quello del target COMPILE_OPTIONS
, quindi applicarlo a ciascuna delle sorgenti del target individualmente, omettendolo dal file sorgente specifico come richiesto.
Tuttavia, sebbene ciò possa funzionare in molti scenari, presenta un paio di problemi.
Primo: le proprietà dei file di origine non includono COMPILE_OPTIONS
, solo COMPILE_FLAGS
. Questo è un problema perché il COMPILE_OPTIONS
di un target può includere espressioni del generatore , ma COMPILE_FLAGS
non le supporta. Quindi dovresti adattare le espressioni del generatore durante la ricerca della tua bandiera, e in effetti potresti anche dover "analizzare" le espressioni del generatore se la tua bandiera fosse contenuta in una o più per vedere se dovrebbe essere riapplicata alle rimanenti file sorgenti.
Secondo: a partire da CMake v3.0, le destinazioni possono specificare INTERFACE_COMPILE_OPTIONS
. Ciò significa che una dipendenza del tuo target può aggiungere o sovrascrivere quella del tuo target COMPILE_OPTIONS
tramite i suoi INTERFACE_COMPILE_OPTIONS
. Quindi dovresti ulteriormente iterare ricorsivamente attraverso tutte le dipendenze del tuo obiettivo (non è un compito particolarmente facile poiché l'elenco di LINK_LIBRARIES
per il target può contenere anche espressioni del generatore) per trovare quelle che stanno applicando il flag del problema e provare a rimuoverlo da quelli anche gli obiettivi INTERFACE_COMPILE_OPTIONS
.
In questa fase di complessità, cercherò di inviare una patch a CMake per fornire la funzionalità per rimuovere incondizionatamente un flag specifico da un file di origine.
1: si noti che a differenza della COMPILE_FLAGS
proprietà sui file di origine, la COMPILE_FLAGS
proprietà sulle destinazioni è deprecata.