c cmake cross-compiling flags

Compilación cruzada de CMake: se ignoran los indicadores de C del archivo de la cadena de herramientas



cross-compiling flags (2)

He encontrado una solución temporal al reemplazar la línea

SET(CMAKE_C_FLAGS "-std=gnu99")

por

SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)

Yo uso cmake para compilación cruzada. En mi archivo de herramientas hay una línea

SET(CMAKE_C_FLAGS "-std=gnu99")

Esta variable no se establece en CMakeLists.txt de nuevo.

Cuando ejecuto cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .. esta bandera se ignora.

Para ser más detallado: la línea de flags.cmake muestra una línea C_FLAGS = vacía. Pero en CMakeOutput.log puedo encontrar una línea Build flags: -std=gnu99 .

Descubrí que una segunda ejecución de cmake .. (igual con o sin el archivo de cadena de herramientas especificado) soluciona este problema.

Pero ¿por qué no se configura la primera vez que ejecuto cmake?

EDITAR: añadido MNWE

CMakeLists.txt:

cmake_minimum_required(VERSION 2.6) project(myproject) SET(files src/main.c) add_executable(myexec ${files})

avr.cake:

SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_C_COMPILER avr-gcc) SET(CMAKE_C_FLAGS "-std=gnu99")


Solo quería agregar alguna información de fondo (discutida, por ejemplo, aquí, ¿cómo configurar cmake_c / xx_flags por toolchain? ).

En resumen, las CMAKE_<LANG>_FLAGS se almacenan en caché por diseño en los scripts CMake<Lang>Information.cmake (lo que significa que podría cambiarlas en la aplicación GUI de CMake después del paso de configuración).

Por lo tanto, si los configura en el archivo de Toolchain , debe ponerlos primero en el caché. El propio script de CMake (ejecutado después del archivo de Toolchain) no viene con una FORCE , por lo que no se volverá a sobrescribir.

Eche un vistazo a CMakeCInformation.cmake (desde compartir / cmake-2.8 / Módulos):

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 utilizar CMAKE_C_FLAGS_INIT para inyectar CMAKE_C_FLAGS_INIT adicionales. El problema es que los cambios posteriores en el archivo de Toolchain no se reconocerían (la memoria caché no se sobrescribirá, vea más arriba).

Teniendo todo esto en cuenta, su solución temporal es la opción correcta. Para estar realmente seguro, ya que el archivo Toolchain se analiza dos veces durante el proceso de Configuración / Generación, incluso podría agregar una llamada UNSET antes de configurar CMAKE_C_FLAGS en su archivo de herramientas:

UNSET(CMAKE_C_FLAGS CACHE) SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)

Otra solución frecuente es usar algo como:

add_definitions(" -std=gnu99")

para inyectar indicadores de compilación (pero esto no es compatible con la configuración de compilación, como lo son las definiciones de variables). Véase también CMake clang and 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 configurar indicadores de compilación generales en CMake? y la expresión del generador CMake, diferencia el código C / C ++ para más información sobre esto.