2012-07-10 10 views
14

Uso cmake para la compilación cruzada. En mi archivo de cadena de herramientas hay una líneaCMake compilación cruzada: banderas C del archivo toolchain ignorado

SET(CMAKE_C_FLAGS "-std=gnu99") 

Esta variable no está definida en CMakeLists.txt nuevo.

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

Para ser más detallados: La línea flags.cmake muestra una línea vacía C_FLAGS =. 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 el archivo toolchain especificado) corrige este problema.

Pero por qué no se establece la primera vez que corro cmake ??

EDIT: Agregado MNWE

CMakeLists.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") 
+0

¡Gracias! Tuve este problema exacto. – DouglasHeriot

Respuesta

14

he encontrado una solución temporal mediante la sustitución de la línea

SET(CMAKE_C_FLAGS "-std=gnu99") 

por

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

Funciona, gracias (agregué la línea justo después de la instrucción del "proyecto") –

7

Yo sólo quería añadir algo de información (por ejemplo, discutido aquí how to setup cmake_c/xx_flags per toolchain?).

En resumen, las variables CMAKE_<LANG>_FLAGS están en caché por diseño en los scripts CMake<Lang>Information.cmake (lo que significa que puede cambiarlos en la aplicación GUI de CMake después del paso de configuración).

Así que hay que - si la configuración en el archivo Toolchain - los puso en la memoria caché en primer lugar. La propia secuencia de comandos de CMake (ejecutada después del archivo Toolchain) no viene con un FORCE, por lo que no se sobreescribirá nuevamente.

echar 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 se puede ver, la forma oficial de hacerlo sería utilizar 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á, ver más arriba).

Tomados en cuenta todo esto, la solución temporal es la elección correcta.Para estar realmente seguro - porque el archivo Toolchain se analiza dos veces durante el proceso de configuración/Generación - incluso se podría añadir una llamada UNSET antes de 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 frecuentemente encontrado es usar algo como :

add_definitions(" -std=gnu99") 

para inyectar indicadores de compilación (pero esto no es consciente de la configuración de compilación, ya que las definiciones de las variables son). También podría CMake clang and c++0x

Con CMake 2.8.12 hubo nuevos comandos introducidos, por lo que podría hacer (no probado, sólo para mostrar las posibilidades):

add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>") 
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>") 

Ver What is the modern method for setting general compile flags in CMake? y CMake generator expression, differentiate C/C++ code para más información sobre esto.

Cuestiones relacionadas