2013-09-06 24 views
5

Zastanawiam się, jak zarządzać zależnościami zewnętrznego projektu. Powiedzmy, że mam trzy projekty, każdy w innym repozytorium:CMake: zależności od zewnętrznego projektu

  1. Rdzeń: Biblioteka eksportuje wiele przydatnych rzeczy.
  2. Lib1: biblioteka z określonymi klasami (w zależności od Core).
  3. wykonywalny: używa rzeczy z Rdzenia a także z LIB1.

Każdy projekt z jego CMakeLists.txt. Korzystanie find_package i definiowanie ścieżek na CMake mogę zbudować każdy projekt bez problemów i zainstalować go (I następnie this tuto zbudować .cmake plików do biblioteki)


Teraz staram się uczynić ten proces tak proste, jak to możliwe, Wprowadzam makro ExternalProject_Add, w ten sposób ludzie będą musieli tylko sklonować repozytorium Executable i przy pomocy plików CMake Lib1 i Core są również pobierane, kompilowane i łączone.

Problemem jest to, że wykonywalny i LIB1 zależy Rdzenia ale chcę go sklonować (i skompilowane) tylko raz. Tutaj jest problem:

  • W wykonywalne CWprowadä klony i buduje Rdzeń z funkcjami ExternalProject_Add.
  • Następnie CUpewnij klony LIB1 i szukać Rdzenia ale nie został jeszcze zainstalowany, więc nie ma core-targets.cmake plik (core-config.cmake jest dostępny) i ... budynek nie ...

nie wiem, czy jest udokumentowany sposób pracy z tego rodzaju drzewa projektu lub będę pisać jakieś obejście kiedy Rdzeń jest ujęte jako zależność zewnętrzny profesjonalista w celu uniknięcia użycia pliku core-targets.cmake.

Dzięki!


Rozwiązanie

zdałem sobie sprawę, że podczas korzystania ExternalProject_Add pobiera, buduje i zainstalować projekt tak, to w folderze install-mam już wszystkie pliki potrzebne do kompilacji jego utrzymaniu.

Więc mogę zarządzać ten problem następujące kroki (również na celu kompilacji):

  • * ExternalProject_Add * dla Rdzeń
  • * ExternalProject_Add * dla LIB1 przechodząc Install_Dir rdzenia jako argument
  • ... i Plik wykonywalny.
+0

Widzę dwie alternatywy: (1) utworzyć pojedynczy projekt CMake dla wszystkich bibliotek i plików wykonywalnych; (2) sprawiają, że 'Executable' zależy tylko od' Lib1'. –

+0

(skopiowane jako rozwiązanie) Uświadomiłem sobie, że podczas korzystania z ExternalProject_Add pobiera, buduje i INSTALUJE projekt, więc w folderze instalacji mam już wszystkie pliki potrzebne do skompilowania jego zależności. Więc mogę poradzić sobie z tym problemem, wykonując następujące kroki (również w przypadku zlecenia budowy): * ExternalProject_Add dla Core * ExternalProject_Add dla Lib1 przekazującego Core dir instalacji jako argument. * ..i Plik wykonywalny. (skopiowane w pytaniu) – jgsogo

Odpowiedz

1

Dodam dwa projekty convenience do Executable, które byłyby zawarte w podfolderach i skorzystać z ExternalProject_Add.

add_subdirectory(CoreWrapper) # Use ExternalProject_Add here 
add_subdirectory(Lib1Wrapper) # Use ExternalProject_Add here 

Teraz można dodać do zależności Executable, tak, że wszystko zostanie zainstalowany przed wykonywalny jest zbudować lub pracować bezpośrednio z plików binarnych zawartych w folderach kompilacji.

Powiązane problemy