2016-03-31 6 views
0

In meinem Projekt habe ich ungefähr 250 Projekte mit einem Hauptprojekt, das die meisten Projekte verwendet. Es ist wichtig, dass alle Projekte auf dem neuesten Stand sind, wenn das Hauptprojekt ausgeführt wird. Im Grunde sollte Visual Studio für alle 250 Projekte nach Änderungen suchen, wenn MainProject kompiliert (und ausgeführt) wird. Meine CMakeLists.txt-Dateien sehen so aus.Alle Projekte in CMake Visual Studio hängen von einem Projekt ab

Root/CMakeLists.txt

.... 
add_subdirectory (MainProject) 
add_subdirectory (ProjectA) 
add_subdirectory (ProjectB) 
add_subdirectory (ProjectC) 
add_subdirectory (ProjectD) 
.... 

Root/Hauptprojekts/CMakeLists.txt

.... 
add_executable (MainProject a.cpp b.cpp) 
add_dependencies (MainProject ProjectA ProjectB ...) 
.... 

Root/ProjectA/CMakeLists.txt

.... 
add_executable (ProjectA a.cpp b.cpp) 
.... 

Offensichtlich ist dies ein sehr vereinfachtes Beispiel, aber hoffentlich ist die Idee da. Um Visual Studio nach Abhängigkeiten für alle 250 Projekte suchen zu lassen, muss ich im Grunde alle anderen Projekte im Hauptprojekt als Abhängigkeiten hinzufügen. Jetzt ist das keine elegante Lösung, da add_dependencies in MainProject viele Abhängigkeiten enthält. Es funktioniert, aber gibt es etwas Eleganteres für dieses Problem?

+0

Sind die anderen Projektbibliotheken im 'MainProject' enthalten? Oder möchten Sie, dass alle Bibliotheken, ausführbaren Dateien und benutzerdefinierten Ziele mit main verknüpft sind? – Florian

+0

Letzteres. Ich möchte, dass alle Bibliotheken, ausführbaren Dateien und benutzerdefinierten Ziele überprüft werden (d. H. Mit main als Abhängigkeit verknüpft sind), wenn das MainProject ausgeführt wird. – Doeful

+0

Dann sehen Sie bitte meine Antwort mit möglichen Lösungen [hier] (http://stackoverflow.com/questions/30532448/what-is-the-name-of-cmakes-default-build-target/30575893#30575893). In Ihrem Fall würde das Überschreiben von 'add_executable()', 'add_library()' und 'add_custom_target()' den Trick bedeuten. Im Moment (soweit in CMake Version 3.5.x) gibt es meines Wissens keine globale Zielliste von CMake selbst. – Florian

Antwort

0

Drehen von mir in eine Antwort

Im Moment (Stand CMake Version 3.5.x), gibt es - soweit ich weiß - keine globale Zielliste von CMake selbst zur Verfügung gestellt (zB als globale Eigenschaft).

Edit: Es wird nun umgesetzt: Globale BUILDSYSTEM_TARGETS Eigenschaft wurde mit CMake freigegeben 3,7

Posible Lösungen

  1. In Ihrem Fall - geht von der Annahme, dass Sie nicht wollen, Ändern aller 250 Unterprojekt CMakeLists.txt Dateien - Überschreiben add_executable(), add_library() und add_custom_target() würde den Trick tun:

    Sicher genug, wenn Sie dies von Grund auf neu machen würden, würde ich - wie @Lindydancer vorgeschlagen hat - Ihre eigenen Versionen dieser Befehle verwenden, um globale Anpassungen zu ermöglichen.

  2. Wenn Sie von der Voraussetzung gehen, dass MainProject immer an erster Stelle ist, können Sie diese ein wenig vereinfachen:

    cmake_minimum_required(VERSION 2.8) 
    
    project(DependsAllTest2) 
    
    macro(add_library _target) 
        _add_library(${_target} ${ARGN}) 
        add_dependencies(MainProject ${_target}) 
    endmacro() 
    
    macro(add_executable _target) 
        _add_executable(${_target} ${ARGN}) 
        add_dependencies(MainProject ${_target}) 
    endmacro() 
    
    macro(add_custom_target _target) 
        _add_custom_target(${_target} ${ARGN}) 
        add_dependencies(MainProject ${_target}) 
    endmacro() 
    
    add_subdirectory(MainProject) 
    add_subdirectory(ProjectA) 
    add_subdirectory(ProjectB) 
    add_subdirectory(ProjectC) 
    add_subdirectory(ProjectD) 
    

Referenzen

Verwandte Themen