Compilación cruzada de CMake: se ignoran las banderas C del archivo de la cadena de herramientas

3 minutos de lectura

avatar de usuario
ejoerns

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")

  • ¡Gracias! Tuve este problema exacto.

    – Douglas Heriot

    1 de julio de 2016 a las 7:55

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)

  • Funciona, gracias (agregué la línea justo después de la instrucción “proyecto”)

    – Tomas K.

    9 de septiembre de 2014 a las 6:44

  • Esto salvó mi noche.

    – Albin Stigo

    21 de diciembre de 2018 a las 21:08

avatar de usuario
florián

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 FORCEpor 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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad