Sus intentos anteriores están agregando más banderas a su archivo / destino en lugar de sobrescribir como parece esperar. Por ejemplo, de los documentos de Propiedades en archivos de origen - COMPILE_FLAGS :
Estos indicadores se agregarán a la lista de indicadores de compilación cuando se compile este archivo fuente.
Debería poder -Weffc++
anular la bandera de foo.cpp haciendo
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Esto debería tener el efecto de agregar -Wno-effc++
after -Weffc++
en el comando del compilador, y la última configuración gana. Para ver el comando completo y comprobar que este es realmente el caso, puede hacer
make VERBOSE=1
Como acotación al margen, uno de los mantenedores de la biblioteca estándar de GNU C ++ presenta una opinión bastante negativa -Weffc++
en esta respuesta .
Otro punto es que está haciendo un mal uso add_definitions
en el sentido de que lo está usando para los indicadores del compilador en lugar de las definiciones del preprocesador previstas.
Seria preferible usar add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
o para las versiones de CMake <3.0 para hacer algo más como:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
En respuesta a más preguntas en los comentarios a continuación, creo que es imposible eliminar de manera confiable una marca en un solo archivo. La razón es que para cualquier archivo fuente dado, tiene el COMPILE_OPTIONS
y 1 de su destino aplicado, pero estos no aparecen en ninguna de las propiedades de ese archivo fuente.COMPILE_FLAGS
Podría buscar quitar el indicador de problema del objetivo COMPILE_OPTIONS
y luego aplicarlo a cada una de las fuentes del objetivo individualmente, omitiéndolo del archivo fuente específico según sea necesario.
Sin embargo, aunque esto podría funcionar en muchos escenarios, tiene un par de problemas.
Primero, las propiedades de los archivos de origen no incluyen COMPILE_OPTIONS
, solo COMPILE_FLAGS
. Esto es un problema porque el COMPILE_OPTIONS
de un destino puede incluir expresiones generadoras , pero COMPILE_FLAGS
no las admite. Por lo tanto, tendría que acomodar las expresiones del generador mientras busca su bandera y, de hecho, tal vez incluso tenga que "analizar" las expresiones del generador si su bandera está contenida en una o más para ver si debe volver a aplicarse al resto archivos fuente.
En segundo lugar, desde CMake v3.0, los destinos pueden especificar INTERFACE_COMPILE_OPTIONS
. Esto significa que una dependencia de su objetivo puede agregar o anular su objetivo a COMPILE_OPTIONS
través de su INTERFACE_COMPILE_OPTIONS
. Entonces, además, tendría que iterar recursivamente a través de todas las dependencias de su objetivo (no es una tarea particularmente fácil ya que la lista de LINK_LIBRARIES
para el objetivo también puede contener expresiones generadoras) para encontrar cualquiera que esté aplicando el indicador de problema, e intentar eliminarlo de esos objetivos ' INTERFACE_COMPILE_OPTIONS
también.
En esta etapa de complejidad, estaría buscando enviar un parche a CMake para proporcionar la funcionalidad para eliminar una marca específica incondicionalmente de un archivo fuente.
1: tenga en cuenta que, a diferencia de la COMPILE_FLAGS
propiedad de los archivos de origen, la COMPILE_FLAGS
propiedad de los destinos está obsoleta.