2015-11-04 2 views
3

У меня возникла проблема с созданием конкретных проектов Visual Studio из дерева исходных кодов CMake. Immagine мы имеем несколько целей в разных подкаталогах. В одном подкаталоге мы инициируем новый проект (и решение). Проекты в этом проекте должны быть частью ALL_BUILD, но не в родительском ALL_BUILD.Вложенные проекты и цели CMake

Короче:

project(Main) 

add_executable(MainApplication ...) 
target_link_libraries(MainApplication PRIVATE Library_A) 

add_subdirectory(Library_A) 
    add_library(Library_A STATIC ...) 

add_subdirectory(Other_Related_Stuff_Using_MainApplication) 
    project(OtherRelatedStuff) 
    add_custom_target(OtherTarget ... DEPENDS MainApplication) 

Теперь с помощью генератора Visual Studio мы получаем два Решение файлов. Это правильно и правильно. В обоих решениях мы имеем эти три проекта (поскольку OtherReleatedStuff зависит от создания MainApplication, а OtherRelatedStuff является частью Main-Project).

Теперь: ALL_BUILD создает все проекты.

Когда я установил

set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 

... в обоих решениях OtherTarget является отключена.

Что я хотел бы сделать, это:

Решение 1: В Main.Sln должно быть не OtherTarget. В OtherRelatedStuff.sln может быть MainApplication, но не нужно строить. Возможно, также не должно быть MainApplication.

Решение 2: В Main.Sln, OtherTarget никогда не должны строить (исключены из сборки). В OtherRelatedStuff.sln, OtherTarget должен строить, но зависимости не должны или должны быть даже видимыми.

Есть ли решение для этого?

ответ

3

Все цели, найденные в одном файле CMakeLists.txt, генерируют файл проекта Visual Studio. И - как вы уже узнали - EXCLUDE_FROM_ALL и EXCLUDE_FROM_DEFAULT_BUILD установлены на цель/проект или каталог.

Таким образом, вы можете разделить/связать свои проекты с использованием ExternalProject_Add(). А так как Other_Related_Stuff зависит от MainApplication, вы должны позвонить ExternalProject_Add() в файл CMake Other_Related_Stuff.

Так что моя рекомендация будет выглядеть следующим образом:

CMakeLists.txt

project(Main) 

add_subdirectory(Library_A) 

add_executable(MainApplication ...) 
target_link_libraries(MainApplication PRIVATE Library_A) 

Other_Related_Stuff/CMakeLists.txt

project(OtherRelatedStuff) 

ExternalProject_Add(
    MainApplication 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. 
    PREFIX MainApplication 
) 
add_custom_target(OtherTarget ... DEPENDS MainApplication) 

Так что теперь ваш главный CMakeLists.txt является Other_Related_Stuff/CMakeLists.txt и он генерирует ваш второй файл решения в подкаталоге MainApplication.

Справочник

Смежные вопросы