2012-04-14 5 views
1

Zeit einen Compiler-Flag zu ändern, wenn gcc, ich die CMakeLists.txt für das Build-Ziel bearbeiten:CMake Compiler-Einstellungen speziell für die lokale Arbeitskopie

if (UNIX) 
    add_definitions(-Wall) 
    add_definitions(-g) 
    #add_definitions(-O2) 
endif (UNIX) 

Das Problem dabei ist, dass git nimmt die Veränderung. Wenn ich diese Änderung beginne, werde ich die anderen Entwickler ärgern, die erwarten, dass sie -O2 anstelle von -g verwenden, aber sie bekommen meine Version, wenn sie nicht zusammenhängende Änderungen vornehmen. Normalerweise könnte ich diese Änderung nur von meinen Commits ausschließen, aber wenn ich eine tatsächliche Änderung an der CMakeLists.txt-Datei mache, gibt es keine Möglichkeit zu vermeiden, meine persönliche Auswahl von Compile-Flags hochzustoßen.

Gibt es eine Möglichkeit, CMake anzuweisen, eine Datei im Build/Verzeichnis zu erstellen (spezifisch für jede Arbeitskopie und damit für jeden Entwickler), die eine einzelne Person nach Herzenslust ändern kann, ohne Projektdateien zu berühren (alles außer bauen/). Natürlich ist unser Build/nicht dem Git-Repository verpflichtet.

Es kann hilfreich sein zu beachten, dass die IDE bei der Verwendung von Visual Studio anstelle von gcc über die Benutzeroberfläche die VS-Lösungsdatei in build/bearbeitet. Das Problem ist, dass wir bei der Verwendung von GNU Makefiles keinen solchen Mechanismus haben.

Unser Projekt ist wie folgt organisiert:

ourproject/ 
    bin/ 
    build/ <-- CMake-generated stuff goes here 
    lib/ 
    src/ 
     abuildtarget/ 
     anotherbuildtarget/ 
      source.cpp 
      source.h 
      CMakeLists.txt 

Antwort

4

Sie CMake verwenden falsch hier. Die add_definitions Funktion ist nicht zum Hinzufügen von Compiler-Optionen wie Sie tun; Stattdessen müssen Vorprozessordefinitionen wie add_definitions(-DDEBUG) hinzugefügt werden.

Was Sie tun möchten, ist die CMAKE_<language>_FLAGS, wenn Sie die gewünschten Optionen konfigurieren. Wenn es ein Standardsatz ist, dass Sie benötigen, dann setzen, dass in der CMakeLists.txt Datei wie:

if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")         
    set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -xhost" CACHE STRING "" FORCE) 

    set(CMAKE_Fortran_FLAGS_NODEBUG "-O0" CACHE STRING "" FORCE) 
    mark_as_advanced(CMAKE_Fortran_FLAGS_NODEBUG) 

    set(CMAKE_Fortran_FLAGS_PROFILING "-O2 -xhost -p" CACHE STRING "" FORCE) 
    mark_as_advanced(CMAKE_Fortran_FLAGS_PROFILING) 

    set(CMAKE_Fortran_FLAGS_DEBUG 
     "-DDEBUG -g -check noarg_temp_created -C -traceback" CACHE STRING "" FORCE) 
endif() 

Wo Fortran durch CXX oder C ersetzt werden.

In diesem Fall setzt CMAKE_<language>_FLAGS_<build type> die Flags basierend auf der Variablen CMAKE_BUILD_TYPE. Wenn es auf Release festgelegt ist, wird CMAKE_Fortran_FLAGS_RELEASE verwendet. Wir haben mehrere andere mögliche Build-Typen hinzugefügt. Wenn der Benutzer etwas wünscht, das nicht zu den Standard-Build-Typen gehört, setzen sie CMAKE_<language>_FLAGS auf das, was sie bei der Konfiguration wünschen, und überschreibt die Build-Typ-Einstellung und verwendet stattdessen die benutzerdefinierten Flags.

+0

Ich denke, Sie sollten nicht nur die Flags "setzen" - es überschreibt, was dort vor hands (z. B. von einem Benutzer angegeben wurde) '-DCMAKE_Fortran_FLAGS = ...' in der Befehlszeile). Ich würde lieber 'set (CMAKE_Fortran_FLAGS" $ {CMAKE_Fortran_FLAGS} new_stuff ")'. – Ela782

+0

@ Ela782 Ich denke, die beste Vorgehensweise ist, die 'CMAKE_Fortran_FLAGS_ ' Flags wie in meinem Beispiel zu setzen, da diese durch den Code und nicht durch den Benutzer gesetzt werden sollen. Der Benutzer kann immer diese überschreiben, indem er 'CMAKE_Fortran_FLAGS' entweder über die Befehlszeile oder über die 'ccmake'-Schnittstelle einstellt. Das Problem mit Ihrer Option ist, wenn der Benutzer etwas angibt, das mit "new_stuff" in Konflikt steht. Einige Compiler beschweren sich möglicherweise über widersprüchliche Optionen, einige können sich nur einen aussuchen und nicht sagen, was sie ausgewählt haben. – tpg2114

+0

Im Allgemeinen sollte die 'CMAKE_ _FLAGS'-Variable nicht vom Entwickler in den CMake-Dateien festgelegt werden; Der Entwickler sollte nur die Erstellungskonfigurationen festlegen und die generische Option für den Benutzer belassen, um festzulegen, ob etwas anderes benötigt wird. – tpg2114

1

Zwar gibt es fast sicherlich eine bessere Methode cmake des Verwendens Ihr Problem zu lösen, ist dieser Teil Ihrer Frage ist leicht adressiert:

aber wenn ich eine tatsächliche Änderung der CMakeLists.txt Datei machen, gibt es Es gibt keine Möglichkeit, meine persönliche Auswahl an Compile-Flags zu vermeiden.

Dies gilt allerdings nur, wenn Sie spezifische, persönliche Datei Änderungen an Ihrem lokalen Repository zu begehen , und selbst dann können Sie entweder git-revert, wenn Sie machen einen Patch zu drücken, oder einen Filter zwischen Ihrem development verwenden und ready-to-push-to-other-developers Zweige - die grobe Idee kann here gefunden werden, obwohl Sie es ziemlich stark bearbeiten müssen, um die verletzenden persönlichen Linien vom Fragenbeispiel zu entfernen.

Eine bessere Option ist dann, nicht die persönlichen Änderungen zu begehen. Mit der Antwort here können Sie bestimmte Änderungen an einer Datei problemlos festschreiben.

Eine Sache zu beachten ist jedoch, dass Sie mit einem dauerhaft schmutzigen Arbeitsbaum enden werden, wenn Sie nicht festgeschriebene Änderungen an einer nicht ignorierten Datei haben; Dies kann oder kann kein Problem sein, abhängig von Ihrem Workflow für Merges etc.

Verwandte Themen