Uso cmake para la compilación cruzada. En mi archivo de cadena de herramientas hay una línea
SET(CMAKE_C_FLAGS "-std=gnu99")
Esta variable no se establece en CMakeLists.txt nuevamente.
cuando corro cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
esta bandera es ignorada.
Para ser más detallado: La línea de flags.cmake
muestra un vacío C_FLAGS =
línea. Pero en CMakeOutput.log
Puedo encontrar una línea Build flags: -std=gnu99
.
Descubrí que una segunda ejecución de cmake ..
(lo mismo con o sin archivo de cadena de herramientas especificado) soluciona este problema.
Pero, ¿por qué no está configurado la primera vez que ejecuto cmake?
EDITAR: Añadido MNWE
CMakeListas.txt:
cmake_minimum_required(VERSION 2.6)
project(myproject)
SET(files src/main.c)
add_executable(myexec ${files})
avr.cmake:
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_C_COMPILER avr-gcc)
SET(CMAKE_C_FLAGS "-std=gnu99")
Encontré una solución temporal reemplazando la línea
SET(CMAKE_C_FLAGS "-std=gnu99")
por
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Solo quería agregar información de fondo (discutida, por ejemplo, aquí ¿Cómo configurar cmake_c/xx_flags por cadena de herramientas?).
En resumen, el CMAKE_<LANG>_FLAGS
las variables se almacenan en caché por diseño en el CMake<Lang>Information.cmake
scripts (lo que significa que puede cambiarlos en la aplicación GUI de CMake después del paso de configuración).
Así que tienes que – si los configuras en el cadena de herramientas archivo – póngalos en el caché primero. El propio script de CMake (ejecutado después del archivo Toolchain) no viene con un FORCE
por lo que no lo sobrescribirá de nuevo.
Echa un vistazo a CMakeCInformation.cmake (de share\cmake-2.8\Modules):
set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}")
# avoid just having a space as the initial value for the cache
if(CMAKE_C_FLAGS_INIT STREQUAL " ")
set(CMAKE_C_FLAGS_INIT)
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING
"Flags used by the compiler during all build types.")
Como puede ver, la forma oficial de hacerlo sería usando CMAKE_C_FLAGS_INIT
para inyectar banderas adicionales. El problema es que los cambios posteriores en el archivo Toolchain no se reconocerán (la memoria caché no se sobrescribirá, consulte más arriba).
Teniendo todo esto en cuenta, su solución temporal es la elección correcta. Para estar realmente seguro, debido a que el archivo Toolchain se analiza dos veces durante el proceso de configuración/generación, incluso podría agregar un UNSET
llamar antes de configurar CMAKE_C_FLAGS
en su archivo de cadena de herramientas:
UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Otra solución que se encuentra a menudo es usar algo como:
add_definitions(" -std=gnu99")
para inyectar indicadores de compilación (pero esto no tiene en cuenta la configuración de compilación, como lo son las definiciones de variables). Véase también CMake clang y c++0x
Con CMake 2.8.12 se introdujeron nuevos comandos, por lo que podría hacer (no probado, solo para mostrar las posibilidades):
add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")
Consulte ¿Cuál es el método moderno para establecer indicadores de compilación generales en CMake? y la expresión del generador CMake, diferencie el código C/C++ para obtener más información.
¡Gracias! Tuve este problema exacto.
– Douglas Heriot
1 de julio de 2016 a las 7:55