2012-07-10 14 views
14

Ich benutze cmake für Cross-Compiling. In meiner Toolchain-Datei gibt es eine ZeileCMake Cross-Compiling: C Flags von Toolchain-Datei ignoriert

SET(CMAKE_C_FLAGS "-std=gnu99") 

Diese Variablen nicht wieder in CMakeLists.txt gesetzt.

Wenn ich cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .. ausführen, wird dieses Flag ignoriert.

Um genauer zu sein: Die Zeile flags.cmake zeigt eine leere C_FLAGS = Zeile. Aber in CMakeOutput.log kann ich eine Linie Build flags: -std=gnu99 finden.

Ich fand heraus, dass ein zweiter Lauf von cmake .. (dasselbe mit oder ohne Toolchain-Datei angegeben) dieses Problem behebt.

Aber warum ist es nicht das erste Mal, dass ich cmake ??

EDIT: Added 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

Danke! Ich hatte genau dieses Problem. – DouglasHeriot

Antwort

14

ich eine vorübergehende Lösung, die durch die Linie ersetzt

gefunden haben
SET(CMAKE_C_FLAGS "-std=gnu99") 

von

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

Es funktioniert, danke (Ich habe die Zeile direkt nach der "Projekt" -Anweisung hinzugefügt) –

7

Ich wollte nur zum Beispiel einige Hintergrundinformationen (diskutiert hinzufügen hier how to setup cmake_c/xx_flags per toolchain?).

Kurz gesagt, die CMAKE_<LANG>_FLAGS Variablen werden im Design in den CMake<Lang>Information.cmake Skripts zwischengespeichert (was bedeutet, dass Sie sie in der GUI-Anwendung von CMake nach dem Konfigurationsschritt ändern konnten).

Sie müssen also - wenn Sie sie in der Datei Toolchain setzen - sie zuerst in den Cache stellen. CMake's eigenes Skript (ausgeführt nach der Toolchain-Datei) kommt nicht mit FORCE, es wird also nicht nochmal überschrieben.

Werfen Sie einen Blick in CMakeCInformation.cmake (von 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.") 

Wie Sie die offizielle Art und Weise sehen können, zu tun, wäre es CMAKE_C_FLAGS_INIT zusätzliche Flags injizieren werden. Das Problem besteht darin, dass spätere Änderungen in der Toolchain-Datei nicht erkannt werden (der Cache wird nicht überschrieben, siehe oben).

All dies berücksichtigt, ist Ihre temporäre Lösung die richtige Wahl.Um wirklich sicher zu sein - weil die Toolchain-Datei zweimal während der Konfiguration/Stellungsprozesses analysiert wird - man könnte sogar einen UNSET Anruf hinzufügen, bevor CMAKE_C_FLAGS in Ihrer Toolchain-Datei einstellen:

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

Eine weitere häufig gefundene Lösung zu verwenden ist so etwas wie :

injizieren Compiler-Flags (aber das ist nicht Build-Konfiguration bewusst, wie die Variablendefinitionen sind). Siehe auch CMake clang and c++0x

Mit CMake 2.8.12 dort neue Befehle eingeführt wurden, so könnten Sie tun (nicht getestet, nur die Möglichkeiten zeigen):

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

Siehe What is the modern method for setting general compile flags in CMake? und CMake generator expression, differentiate C/C++ code für mehr zu diesem Thema.

Verwandte Themen