Para CMake moderno (versiones 2.8.12 y posteriores) debe usar target_compile_options
, que usa propiedades de destino internamente.
CMAKE_<LANG>_FLAGS
es una variable global y la más propensa a errores de uso. Tampoco admite expresiones generadoras , lo que puede resultar muy útil.
add_compile_options
se basa en las propiedades del directorio, lo que está bien en algunas situaciones, pero normalmente no es la forma más natural de especificar opciones.
target_compile_options
funciona según el objetivo (mediante la configuración de las propiedades COMPILE_OPTIONS
y el INTERFACE_COMPILE_OPTIONS
objetivo), lo que generalmente da como resultado el código CMake más limpio, ya que las opciones de compilación para un archivo fuente están determinadas por el proyecto al que pertenece el archivo (en lugar de por el directorio en el que está ubicado en el disco duro). Esto tiene la ventaja adicional de que se encarga automáticamente de pasar las opciones a los objetivos dependientes si se solicita.
A pesar de que son un poco más detallados, los comandos por objetivo permiten un control razonablemente detallado sobre las diferentes opciones de compilación y (en mi experiencia personal) son los menos propensos a causar dolores de cabeza a largo plazo.
En teoría, también podría establecer las propiedades respectivas directamente usando set_target_properties
, pero target_compile_options
generalmente es más legible.
Por ejemplo, para establecer las opciones de compilación de un destino en foo
función de la configuración utilizando expresiones generadoras, puede escribir:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")