Anular indicadores de comstackción para archivos individuales

Me gustaría utilizar un conjunto global de indicadores para comstackr un proyecto, lo que significa que en mi archivo CMakeLists.txt de nivel superior he especificado:

ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x ) 

Sin embargo, para un archivo específico (digamos “foo.cpp”) en un subdirectorio, quiero cambiar los indicadores de comstackción para que no se apliquen -Weffc ++ (la biblioteca comercial incluida no puedo cambiar). Para simplificar la situación, para usar solo -Wall, lo intenté:

  SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) 

que no funcionó. También intenté

 SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) 

y

 ADD_EXECUTABLE( foo foo.cpp ) SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall ) 

, en el que ninguno de los dos funcionó.

Finalmente, traté de eliminar esta definición:

 REMOVE_DEFINITIONS( -Weffc++ ) ADD_EXECUTABLE( foo foo.cpp ) ADD_DEFINITIONS( -Weffc++ ) 

, que tampoco funcionó (es decir, recibo muchas advertencias de estilo sobre la biblioteca comercial). (** Nota: las advertencias SON suprimidas si NO vuelvo a incluir la directiva -Weffc ++ después de comstackr el ejecutable).

También traté de eliminar temporalmente las banderas de comstackción: http://www.cmake.org/pipermail/cmake/2007-June/014614.html , pero eso no ayudó.

¿No hay una solución elegante para esto?

Sus bashs anteriores agregan más indicadores a su archivo / destino en lugar de sobrescribirlos como parece esperar. Por ejemplo, de los documentos para Propiedades en Archivos de origen – COMPILE_FLAGS :

Estos indicadores se agregarán a la lista de indicadores de comstackción cuando se genere este archivo fuente.

Debería poder -Weffc++ indicador -Weffc++ para foo.cpp haciendo

 set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++) 

Esto debería tener el efecto de agregar -Wno-effc++ después de -Weffc++ en el comando del comstackdor, y la última configuración gana. Para ver el comando completo y verificar que este sea el caso, puede hacer

 make VERBOSE=1 

Como un aparte, uno de los mantenedores de la Biblioteca Estándar GNU C ++ presenta una opinión bastante negativa sobre -Weffc++ en esta respuesta .

Otro punto es que está haciendo un uso indebido de add_definitions en el sentido de que está utilizando esto para los indicadores del comstackdor en lugar de las definiciones del preprocesador.

Sería 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 bandera en un solo archivo. La razón es que para cualquier archivo fuente dado, tiene COMPILE_OPTIONS y COMPILE_FLAGS 1 de su objective aplicado, pero estos no aparecen en ninguna de las propiedades para ese archivo fuente.

Podría ver cómo quitar el indicador de problema de COMPILE_OPTIONS del objective y luego aplicarlo a cada una de las fonts del objective de forma individual, omitiéndola 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 fuente no incluyen COMPILE_OPTIONS , solo COMPILE_FLAGS . Esto es un problema porque las COMPILE_OPTIONS de un objective pueden incluir expresiones de generador , pero COMPILE_FLAGS no las admite. Así que tendrías que acomodar las expresiones del generador mientras buscas tu bandera, y de hecho podrías incluso tener que “analizar” las expresiones del generador si tu bandera estuviera en uno o más para ver si debería volver a aplicarse al rest archivos fuente.

En segundo lugar, desde CMake v3.0, los objectives pueden especificar INTERFACE_COMPILE_OPTIONS . Esto significa que una dependencia de su objective puede agregar o anular las COMPILE_OPTIONS su destino a través de INTERFACE_COMPILE_OPTIONS . Por lo tanto, deberá iterar recursivamente a través de todas las dependencias de su destino (no es una tarea particularmente fácil ya que la lista de LINK_LIBRARIES para el destino también puede contener expresiones de generador) para encontrar cualquiera que esté aplicando el indicador de problema, y ​​tratar de eliminarlo de esos objectives ‘ INTERFACE_COMPILE_OPTIONS también.

En esta etapa de complejidad, buscaría enviar un parche a CMake para proporcionar la funcionalidad para eliminar un indicador específico incondicionalmente de un archivo fuente.


1: COMPILE_FLAGS en cuenta que, a diferencia de la propiedad COMPILE_FLAGS en los archivos de origen, la propiedad COMPILE_FLAGS en los destinos está obsoleta.

Simplemente agregando a la respuesta correcta de @Fraser.

En caso de que quiera agregar la bandera especial a carpetas específicas, podría hacer lo siguiente:

 file(GLOB SPECIAL_SRC_FILES "path/one/src/*.cpp" "path/two/src/*.cpp") set_property(SOURCE ${SPECIAL_SRC_FILES} PROPERTY COMPILE_FLAGS -Wno-effc++) 

o

 file(GLOB SPECIAL_SRC_FILES "path/one/src/*.cpp" "path/two/src/*.cpp") set_source_files_properties(${SPECIAL_SRC_FILES} PROPERTIES COMPILE_FLAGS -Wno-effc++) 

Tenga en cuenta que no se recomienda usar GLOB como se explica aquí