c++ - Anular indicadores de compilación para archivos individuales
cmake compiler-warnings (1)
Me gustaría utilizar un conjunto global de indicadores para compilar 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 compilació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 compilar el ejecutable).
También traté de eliminar temporalmente las banderas de compilación: http://www.cmake.org/pipermail/cmake/2007-June/014614.html , pero eso no ayudó.
¿No hay una solución elegante para esto?
Sus intentos 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 compilació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 compilador, 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 compilador 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 objetivo 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 objetivo y luego aplicarlo a cada una de las fuentes del objetivo 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 objetivo 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 resto archivos fuente.
En segundo lugar, desde CMake v3.0, los objetivos pueden especificar INTERFACE_COMPILE_OPTIONS
. Esto significa que una dependencia de su objetivo 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 objetivos '' 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.