Mam projekt A, który eksportuje bibliotekę statyczną jako cel:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Teraz chcę użyć projektu A jako projektu zewnętrznego z projektu B i uwzględnić jego wbudowane cele:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Problem polega na tym, że plik dołączania jeszcze nie istnieje, gdy jest uruchamiany CMakeLists projektu B.
Czy istnieje sposób na uzależnienie dołączenia od budowanego projektu zewnętrznego?
Aktualizacja : Napisałem krótki samouczek dotyczący CMake by Example w oparciu o ten i inne typowe problemy, które napotkałem.
źródło
ExternalProject_Add
zachowywał się jakadd_subdirectory
i wystawiał wszystkie cele. Rozwiązanie, które opisałeś powyżej, jest prawdopodobnie nadal najczystsze.ExternalProject
. Czy jest to spójność, czy bardziej kanoniczna, czy coś innego? Jestem pewien, że brakuje mi tutaj czegoś podstawowego.Ten post ma rozsądną odpowiedź:
CMakeLists.txt.in
:CMakeLists.txt
:Jednak wydaje się to dość hakerskie. Chciałbym zaproponować alternatywne rozwiązanie - użyj podmodułów Git.
Następnie
MyProject/dependencies/gtest/CMakeList.txt
możesz zrobić coś takiego:Nie próbowałem jeszcze tego intensywnie, ale wydaje się czystszy.
Edycja: jest wada tego podejścia: podkatalog może uruchamiać
install()
polecenia, których nie chcesz. Ten post ma podejście do ich wyłączania, ale był błędny i nie działał dla mnie.Edycja 2: Jeśli używasz
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
, wydaje się, żeinstall()
polecenia w podkatalogu nie są używane domyślnie.źródło
GIT_TAG
podczas klonowania, możesz stracić powtarzalność kompilacji, ponieważ za 2 lata ktoś uruchamiający skrypt kompilacji otrzyma inna wersja niż ta, którą zrobiłeś. CUpewnij za docs polecić tego zbyt.Edycja: CMake ma teraz wbudowaną obsługę tego. Zobacz nową odpowiedź .
Możesz także wymusić kompilację zależnego celu w dodatkowym procesie tworzenia
Zobacz moją odpowiedź na pokrewny temat.
źródło
cmake
ExternalProject_Add
rzeczywiście może być używany, ale nie podobało mi się to - to, że wykonuje coś podczas budowania, ciągłej ankiety itp ... Wolałbym budować projekt w fazie kompilacji, nic więcej. Próbowałem nadpisaćExternalProject_Add
kilka prób, niestety bez powodzenia.Następnie próbowałem również dodać podmoduł git, ale to przeciąga całe repozytorium git, podczas gdy w niektórych przypadkach potrzebuję tylko podzbioru całego repozytorium git. Co sprawdziłem - rzeczywiście można wykonać rzadkie wyewidencjonowanie gita, ale wymagają one oddzielnej funkcji, o której pisałem poniżej.
Poniżej dodałem dwa wywołania funkcji, aby zilustrować sposób korzystania z funkcji.
Ktoś może nie chcieć wykupić master / trunk, ponieważ ten może być uszkodzony - wtedy zawsze można określić konkretny tag.
Wypisanie nastąpi tylko raz, dopóki nie wyczyścisz folderu pamięci podręcznej.
źródło
Szukałem podobnego rozwiązania. Odpowiedzi tutaj i samouczek na górze mają charakter informacyjny. Przestudiowałem posty / blogi, o których tutaj mowa, aby zbudować mój udany. Wysyłam kompletny plik CMakeLists.txt, który pracował dla mnie. Myślę, że byłoby to pomocne jako podstawowy szablon dla początkujących.
"CMakeLists.txt"
źródło