2012-07-10 11 views
14

Uso cmake per la compilazione incrociata. Nel mio file toolchain c'è una lineaCompilazione incrociata CMake: flag C dal file toolchain ignorato

SET(CMAKE_C_FLAGS "-std=gnu99") 

Questa variabile non è impostata in CMakeLists.txt di nuovo.

Quando corro cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .. questo flag viene ignorato.

Per informazioni più dettagliate: La riga flags.cmake mostra una riga vuota C_FLAGS =. Ma in CMakeOutput.log posso trovare una riga Build flags: -std=gnu99.

Ho scoperto che una seconda versione di cmake .. (stessa con o senza file toolchain specificato) risolve questo problema.

Ma perché non è impostato la prima volta che eseguo cmake ??

EDIT: Aggiunto ECNO

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

Grazie! Ho avuto questo problema esatto. – DouglasHeriot

risposta

14

ho trovato una soluzione temporanea, sostituendo la linea

da

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

Funziona, grazie (ho aggiunto la riga subito dopo l'istruzione "project") –

7

volevo solo aggiungere alcune informazioni di fondo (per esempio discusso qui how to setup cmake_c/xx_flags per toolchain?).

In breve, le variabili CMAKE_<LANG>_FLAGS sono memorizzate nella cache in base alla progettazione negli script CMake<Lang>Information.cmake (ovvero è possibile modificarle nell'applicazione GUI di CMake dopo il passaggio di configurazione).

Quindi è necessario - se li si imposta nel file Toolchain - inserirli prima nella cache. Lo script di CMake (eseguito dopo il file Toolchain) non viene fornito con lo FORCE, quindi non lo sovrascriverà più.

Date un'occhiata in CMakeCInformation.cmake (dalla quota \ 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.") 

Come si può vedere, il mezzo ufficiale per farlo sarebbe utilizzando CMAKE_C_FLAGS_INIT per iniettare flag addizionali. Il problema è che le successive modifiche nel file Toolchain non verrebbero riconosciute (la cache non verrà sovrascritta, vedi sopra).

Tenuto conto di tutto ciò, la soluzione temporanea è la scelta giusta.Per essere veramente sicuri - perché il file toolchain viene analizzato due volte durante il processo di configurazione/Generation - anche si potrebbe aggiungere un UNSET chiamata prima di impostare CMAKE_C_FLAGS nel file toolchain:

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

Un'altra soluzione spesso trovato è quello di usare qualcosa di simile :

add_definitions(" -std=gnu99") 

per iniettare flag di compilazione (ma questo non è configurato per la configurazione, poiché le definizioni di variabile sono). Vedi anche CMake clang and c++0x

Con CMake 2.8.12 ci sono stati nuovi comandi introdotti, in modo che si possa fare (non testato, solo per mostrare le possibilità):

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

Vedi What is the modern method for setting general compile flags in CMake? e CMake generator expression, differentiate C/C++ code per maggiori informazioni su questo.

Problemi correlati