2016-03-31 13 views
0

Projemde, projelerin çoğunu kullanan bir ana projeyle yaklaşık 250 projem var. Ana proje çalıştırıldığında tüm projelerin güncel olması önemlidir. Temel olarak, Visual Studio, MainProject derlendiğinde (ve çalıştırıldığında) tüm 250 projeyi kontrol etmelidir. CMakeLists.txt dosyalarım şunun gibi görünüyor.Tüm projeler CMake Visual Studio'da bir projeye bağlıdır

kök/CMakeLists.txt

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

kök/MainProject/CMakeLists.txt

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

kök/ProjectA/CMakeLists.txt

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

Açıkçası bu çok basitleştirilmiş bir örnektir, ama umarım fikir budur. Temel olarak, Visual Studio'nun tüm 250 proje için bağımlılıkları kontrol etmesini sağlamak için ana projedeki diğer tüm projeleri bağımlılıklar olarak eklemem gerekiyor. Artık bu, hiç de zarif bir çözüm değildir, çünkü MainProject uygulamasında add_dependencies, bir çok bağımlılığa sahiptir. Çalışıyor, ama bu problem için daha zarif bir şey var mı? Bildiğim kadarıyla - - Bir olarak CMake kendisi (örn tarafından sağlanan hiçbir küresel hedef listesi

+0

Diğer projeler kütüphaneler 'MainProject' içine dahil edilecek mi? Ya da ana ile bağlantılı tüm kütüphaneler, yürütülebilir dosyalar ve özel hedeflere sahip olmak ister misiniz? – Florian

+0

İkincisi. MainProject çalıştırıldığında tüm kitaplıkların, yürütülebilir dosyaların ve özel hedeflerin denetlenmesini (yani, bağımlı olarak ana bağlantıya bağlı) istiyorum. – Doeful

+0

O halde lütfen cevabımı olası çözümler ile [bakınız] gör (http://stackoverflow.com/questions/30532448/what-is-the-name-of-cmakes-default-build-target/30575893#30575893). Senin durumunda muhtemelen 'add_executable() ',' add_library() 've' add_custom_target() 'üzerine yazmak hile yapardı. Şu anda (CMake sürüm 3.5.x'e göre), CMake tarafından sağlanan hiçbir global hedef listesi bildiğim kadarıyla var. – Florian

cevap

0

bir cevap (CKağıt sürüm 3.5.x göre) Şu anda

vardır içine yorumlarımı Torna küresel mülkiyet).

Düzenleme: Artık uygulanır: Küresel BUILDSYSTEM_TARGETS mülkiyet CMake ile serbest bırakıldı 3.7

Posible Çözümler Senin durumunda

  1. - İstemediğiniz varsayımına göre gidiş 250 alt projenin tüm CMakeLists.txt dosyalarını değiştirmek için - add_executable(), add_library() üzerine yazıyor ve add_custom_target() hile yapar:

    cmake_minimum_required(VERSION 2.8) 
    
    project(DependsAllTest) 
    
    macro(add_library _target) 
        _add_library(${_target} ${ARGN}) 
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target}) 
    endmacro() 
    
    macro(add_executable _target) 
        _add_executable(${_target} ${ARGN}) 
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target}) 
    endmacro() 
    
    macro(add_custom_target _target) 
        _add_custom_target(${_target} ${ARGN}) 
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target}) 
    endmacro() 
    
    add_subdirectory(MainProject) 
    add_subdirectory(ProjectA) 
    add_subdirectory(ProjectB) 
    add_subdirectory(ProjectC) 
    add_subdirectory(ProjectD) 
    
    get_property(_allTargets GLOBAL PROPERTY GlobalTargetList) 
    message(STATUS "GlobalTargetList: ${_allTargets}") 
    add_dependencies(MainProject ${_allTargets}) 
    

    Elbette bunu sıfırdan yaparsanız - @Lindydancer'ın önerdiği gibi - global özelleştirmelere izin vermek için bu komutların kendi sürümlerini kullanıyorum. Eğer önkoşul tarafından giderseniz

  2. MainProject ilk daima olduğuna göre, bu biraz basitleştirmek olabilir:

    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) 
    

Kaynaklar