Suas tentativas acima estão adicionando mais sinalizadores ao seu arquivo / destino, em vez de sobrescrever como você parece esperar. Por exemplo, nos documentos de Propriedades nos arquivos de origem - COMPILE_FLAGS :
Esses sinalizadores serão adicionados à lista de sinalizadores de compilação quando este arquivo de origem for construído.
Você deve ser capaz de contra-ordenar o -Weffc++
ordenar bandeira para foo.cpp fazendo
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Isso deve ter o efeito de adicionar -Wno-effc++
após-Weffc++
no comando do compilador, e a última configuração vence. Para ver o comando completo e verificar se este é realmente o caso, você pode fazer
make VERBOSE=1
À parte, um dos mantenedores da Biblioteca Padrão GNU C ++ apresenta uma opinião bastante negativa sobre -Weffc++
em esta resposta .
Outro ponto é que você está usando mal add_definitions
usando no sentido de que está usando isso para sinalizadores de compilador em vez das definições de pré-processador pretendidas.
Seria preferível usar add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
ou para versões do CMake <3.0 para fazer algo mais como:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Em resposta a outras perguntas nos comentários abaixo, acredito que seja impossível remover de forma confiável um sinalizador em um único arquivo. O motivo é que, para qualquer arquivo de origem, ele tem o COMPILE_OPTIONS
eCOMPILE_FLAGS
1 de seu destino aplicado, mas eles não aparecem em nenhuma das propriedades desse arquivo de origem.
Você pode tentar retirar o sinalizador de problema do alvo COMPILE_OPTIONS
, em seguida, aplicá-lo a cada uma das origens do destino individualmente, omitindo-o do arquivo de origem específico conforme necessário.
No entanto, embora isso possa funcionar em muitos cenários, há alguns problemas.
Primeiro - as propriedades dos arquivos de origem não incluem COMPILE_OPTIONS
, apenas COMPILE_FLAGS
. Isso é um problema porque o COMPILE_OPTIONS
de um destino pode incluir expressões geradoras , masCOMPILE_FLAGS
não as suporta. Portanto, você teria que acomodar expressões geradoras enquanto procurava por seu sinalizador e, de fato, talvez até tivesse que "analisar" expressões geradoras se seu sinalizador estivesse contido em um ou mais para ver se deveria ser reaplicado ao restante Arquivos Fonte.
Segundo - desde CMake v3.0, os destinos podem especificar INTERFACE_COMPILE_OPTIONS
. Isso significa que uma dependência do seu alvo pode adicionar ou substituir a do seu alvo por COMPILE_OPTIONS
meio de seu INTERFACE_COMPILE_OPTIONS
. Portanto, você ainda teria que iterar recursivamente por meio de todas as dependências do seu destino (não é uma tarefa particularmente fácil, pois a lista de LINK_LIBRARIES
para o destino também pode conter expressões geradoras) para encontrar qualquer uma que esteja aplicando o sinalizador de problema e tente removê-la daquelas alvos ' INTERFACE_COMPILE_OPTIONS
também.
Neste estágio de complexidade, gostaria de enviar um patch ao CMake para fornecer a funcionalidade de remover um sinalizador específico incondicionalmente de um arquivo de origem.
1: Observe que, ao contrário da COMPILE_FLAGS
propriedade nos arquivos de origem, a COMPILE_FLAGS
propriedade nos destinos está obsoleta.